cp: Only call chmod with -p or -a
Previously, when the destination file was created with fopen, we needed to use fchmod to set its permissions. Now that we pass in the mode to creat, we already get the desired behavior of creating the file with the same mode as the source file modified by the user's file creation mask. This fixes the issue where a directory or special file created with mkdir/mknod does not end up with the appropriate mode with -p or -a (since it may have been narrowed by the umask). This also allows us to clear the SUID and SGID bits from the mode if the chown fails, as specified by POSIX.
This commit is contained in:
		
				
					committed by
					
						 Anselm R Garbe
						Anselm R Garbe
					
				
			
			
				
	
			
			
			
						parent
						
							3276fbea1c
						
					
				
				
					commit
					51e432cc44
				
			
							
								
								
									
										11
									
								
								libutil/cp.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								libutil/cp.c
									
									
									
									
									
								
							| @@ -139,9 +139,6 @@ cp(const char *s1, const char *s2, int depth) | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		/* preserve permissions by default */ | ||||
| 		fchmod(f2, st.st_mode); | ||||
|  | ||||
| 		close(f1); | ||||
| 		close(f2); | ||||
| 	} | ||||
| @@ -155,12 +152,16 @@ cp(const char *s1, const char *s2, int depth) | ||||
| 			cp_status = 1; | ||||
| 		} | ||||
|  | ||||
| 		/* owner */ | ||||
| 		/* owner and mode */ | ||||
| 		if (!S_ISLNK(st.st_mode)) { | ||||
| 			if (chown(s2, st.st_uid, st.st_gid) < 0) { | ||||
| 				weprintf("chown %s:", s2); | ||||
| 				cp_status = 1; | ||||
| 				return 0; | ||||
| 				st.st_mode &= ~(S_ISUID | S_ISGID); | ||||
| 			} | ||||
| 			if (chmod(s2, st.st_mode) < 0) { | ||||
| 				weprintf("chmod %s:", s2); | ||||
| 				cp_status = 1; | ||||
| 			} | ||||
| 		} else { | ||||
| 			if (lchown(s2, st.st_uid, st.st_gid) < 0) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user