aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/utimes.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/fs/utimes.c b/fs/utimes.c
index 682eb63b20ad..b9912ecbee24 100644
--- a/fs/utimes.c
+++ b/fs/utimes.c
@@ -38,6 +38,14 @@ asmlinkage long sys_utime(char __user *filename, struct utimbuf __user *times)
38 38
39#endif 39#endif
40 40
41static bool nsec_valid(long nsec)
42{
43 if (nsec == UTIME_OMIT || nsec == UTIME_NOW)
44 return true;
45
46 return nsec >= 0 && nsec <= 999999999;
47}
48
41/* If times==NULL, set access and modification to current time, 49/* If times==NULL, set access and modification to current time,
42 * must be owner or have write permission. 50 * must be owner or have write permission.
43 * Else, update from *times, must be owner or super user. 51 * Else, update from *times, must be owner or super user.
@@ -52,6 +60,11 @@ long do_utimes(int dfd, char __user *filename, struct timespec *times, int flags
52 struct file *f = NULL; 60 struct file *f = NULL;
53 61
54 error = -EINVAL; 62 error = -EINVAL;
63 if (times && (!nsec_valid(times[0].tv_nsec) ||
64 !nsec_valid(times[1].tv_nsec))) {
65 goto out;
66 }
67
55 if (flags & ~AT_SYMLINK_NOFOLLOW) 68 if (flags & ~AT_SYMLINK_NOFOLLOW)
56 goto out; 69 goto out;
57 70