mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	utimes: Clamp the timestamps before update
POSIX is ambiguous on the behavior of timestamps for futimens, utimensat and utimes. Whether to return an error or silently clamp a timestamp beyond the range supported by the underlying filesystems is not clear. POSIX.1 section for futimens, utimensat and utimes says: (http://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html) The file's relevant timestamp shall be set to the greatest value supported by the file system that is not greater than the specified time. If the tv_nsec field of a timespec structure has the special value UTIME_NOW, the file's relevant timestamp shall be set to the greatest value supported by the file system that is not greater than the current time. [EINVAL] A new file timestamp would be a value whose tv_sec component is not a value supported by the file system. The patch chooses to clamp the timestamps according to the filesystem timestamp ranges and does not return an error. This is in line with the behavior of utime syscall also since the POSIX page(http://pubs.opengroup.org/onlinepubs/009695399/functions/utime.html) for utime does not mention returning an error or clamping like above. Same for utimes http://pubs.opengroup.org/onlinepubs/009695399/functions/utimes.html Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com> Acked-by: Jeff Layton <jlayton@kernel.org>
This commit is contained in:
		
							parent
							
								
									f8b92ba67c
								
							
						
					
					
						commit
						42e729b9dd
					
				
					 1 changed files with 2 additions and 4 deletions
				
			
		|  | @ -36,16 +36,14 @@ static int utimes_common(const struct path *path, struct timespec64 *times) | |||
| 		if (times[0].tv_nsec == UTIME_OMIT) | ||||
| 			newattrs.ia_valid &= ~ATTR_ATIME; | ||||
| 		else if (times[0].tv_nsec != UTIME_NOW) { | ||||
| 			newattrs.ia_atime.tv_sec = times[0].tv_sec; | ||||
| 			newattrs.ia_atime.tv_nsec = times[0].tv_nsec; | ||||
| 			newattrs.ia_atime = timestamp_truncate(times[0], inode); | ||||
| 			newattrs.ia_valid |= ATTR_ATIME_SET; | ||||
| 		} | ||||
| 
 | ||||
| 		if (times[1].tv_nsec == UTIME_OMIT) | ||||
| 			newattrs.ia_valid &= ~ATTR_MTIME; | ||||
| 		else if (times[1].tv_nsec != UTIME_NOW) { | ||||
| 			newattrs.ia_mtime.tv_sec = times[1].tv_sec; | ||||
| 			newattrs.ia_mtime.tv_nsec = times[1].tv_nsec; | ||||
| 			newattrs.ia_mtime = timestamp_truncate(times[1], inode); | ||||
| 			newattrs.ia_valid |= ATTR_MTIME_SET; | ||||
| 		} | ||||
| 		/*
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Deepa Dinamani
						Deepa Dinamani