2007-08-09 09:26:46

by Miklos Szeredi

[permalink] [raw]
Subject: [patch 2/9] VFS: check nanoseconds in utimensat

From: Miklos Szeredi <[email protected]>

utimensat() (and possibly other callers of do_utimes()) didn't check
if the nanosecond value was within the allowed range.

Signed-off-by: Miklos Szeredi <[email protected]>
---

Index: linux/fs/utimes.c
===================================================================
--- linux.orig/fs/utimes.c 2007-08-09 11:01:30.000000000 +0200
+++ linux/fs/utimes.c 2007-08-09 11:04:19.000000000 +0200
@@ -38,6 +38,14 @@ asmlinkage long sys_utime(char __user *f

#endif

+static bool nsec_valid(long nsec)
+{
+ if (nsec == UTIME_OMIT || nsec == UTIME_NOW)
+ return true;
+
+ return nsec >= 0 && nsec <= 999999999;
+}
+
/* If times==NULL, set access and modification to current time,
* must be owner or have write permission.
* Else, update from *times, must be owner or super user.
@@ -52,6 +60,11 @@ long do_utimes(int dfd, char __user *fil
struct file *f = NULL;

error = -EINVAL;
+ if (times && (!nsec_valid(times[0].tv_nsec) ||
+ !nsec_valid(times[1].tv_nsec))) {
+ goto out;
+ }
+
if (flags & ~AT_SYMLINK_NOFOLLOW)
goto out;


--