mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	Set file mode during zfs_write
3d40b65refactored zfs_vnops.c, which shared much code verbatim between Linux and BSD. After a successful write, the suid/sgid bits are reset, and the mode to be written is stored in newmode. On Linux, this was propagated to both the in-memory inode and znode, which is then updated with sa_update.3d40b65accidentally removed the initialization of newmode, which happened to occur on the same line as the inode update (which has been moved out of the function). The uninitialized newmode can be saved to disk, leading to a crash on stat() of that file, in addition to a merely incorrect file mode. Reviewed-by: Ryan Moeller <ryan@ixsystems.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Antonio Russo <aerusso@aerusso.net> Closes #11474 Closes #11576
This commit is contained in:
		
							parent
							
								
									642d86af0d
								
							
						
					
					
						commit
						8829ba19b7
					
				| @ -528,6 +528,7 @@ zfs_write(znode_t *zp, uio_t *uio, int ioflag, cred_t *cr) | |||||||
| 		    ((zp->z_mode & S_ISUID) != 0 && uid == 0)) != 0) { | 		    ((zp->z_mode & S_ISUID) != 0 && uid == 0)) != 0) { | ||||||
| 			uint64_t newmode; | 			uint64_t newmode; | ||||||
| 			zp->z_mode &= ~(S_ISUID | S_ISGID); | 			zp->z_mode &= ~(S_ISUID | S_ISGID); | ||||||
|  | 			newmode = zp->z_mode; | ||||||
| 			(void) sa_update(zp->z_sa_hdl, SA_ZPL_MODE(zfsvfs), | 			(void) sa_update(zp->z_sa_hdl, SA_ZPL_MODE(zfsvfs), | ||||||
| 			    (void *)&newmode, sizeof (uint64_t), tx); | 			    (void *)&newmode, sizeof (uint64_t), tx); | ||||||
| 		} | 		} | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Antonio Russo
						Antonio Russo