[PATCH v2] vfs: constify arguments to utime family of system calls
From: Eric Biggers
Date: Thu Mar 31 2016 - 21:53:09 EST
The system calls to set file times: utime(), utimes(), futimesat(), and
utimensat(), all take in pointers to a filename and time information,
neither of which is modified. Mark the pointed-to data as 'const' to
better reflect the semantics.
Signed-off-by: Eric Biggers <ebiggers3@xxxxxxxxx>
---
arch/alpha/kernel/osf_sys.c | 4 ++--
fs/compat.c | 13 +++++++++----
fs/utimes.c | 17 +++++++++--------
include/linux/compat.h | 8 ++++----
include/linux/syscalls.h | 12 ++++++------
include/linux/time.h | 3 ++-
6 files changed, 32 insertions(+), 25 deletions(-)
diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c
index 6cc0816..20b4c85 100644
--- a/arch/alpha/kernel/osf_sys.c
+++ b/arch/alpha/kernel/osf_sys.c
@@ -952,7 +952,7 @@ struct itimerval32
};
static inline long
-get_tv32(struct timeval *o, struct timeval32 __user *i)
+get_tv32(struct timeval *o, const struct timeval32 __user *i)
{
return (!access_ok(VERIFY_READ, i, sizeof(*i)) ||
(__get_user(o->tv_sec, &i->tv_sec) |
@@ -1065,7 +1065,7 @@ SYSCALL_DEFINE3(osf_setitimer, int, which, struct itimerval32 __user *, in,
}
SYSCALL_DEFINE2(osf_utimes, const char __user *, filename,
- struct timeval32 __user *, tvs)
+ const struct timeval32 __user *, tvs)
{
struct timespec tv[2];
diff --git a/fs/compat.c b/fs/compat.c
index a71936a..5a6aa35 100644
--- a/fs/compat.c
+++ b/fs/compat.c
@@ -73,7 +73,7 @@ int compat_printk(const char *fmt, ...)
* of sys_utimes.
*/
COMPAT_SYSCALL_DEFINE2(utime, const char __user *, filename,
- struct compat_utimbuf __user *, t)
+ const struct compat_utimbuf __user *, t)
{
struct timespec tv[2];
@@ -87,7 +87,9 @@ COMPAT_SYSCALL_DEFINE2(utime, const char __user *, filename,
return do_utimes(AT_FDCWD, filename, t ? tv : NULL, 0);
}
-COMPAT_SYSCALL_DEFINE4(utimensat, unsigned int, dfd, const char __user *, filename, struct compat_timespec __user *, t, int, flags)
+COMPAT_SYSCALL_DEFINE4(utimensat, unsigned int, dfd,
+ const char __user *, filename,
+ const struct compat_timespec __user *, t, int, flags)
{
struct timespec tv[2];
@@ -102,7 +104,9 @@ COMPAT_SYSCALL_DEFINE4(utimensat, unsigned int, dfd, const char __user *, filena
return do_utimes(dfd, filename, t ? tv : NULL, flags);
}
-COMPAT_SYSCALL_DEFINE3(futimesat, unsigned int, dfd, const char __user *, filename, struct compat_timeval __user *, t)
+COMPAT_SYSCALL_DEFINE3(futimesat, unsigned int, dfd,
+ const char __user *, filename,
+ const struct compat_timeval __user *, t)
{
struct timespec tv[2];
@@ -121,7 +125,8 @@ COMPAT_SYSCALL_DEFINE3(futimesat, unsigned int, dfd, const char __user *, filena
return do_utimes(dfd, filename, t ? tv : NULL, 0);
}
-COMPAT_SYSCALL_DEFINE2(utimes, const char __user *, filename, struct compat_timeval __user *, t)
+COMPAT_SYSCALL_DEFINE2(utimes, const char __user *, filename,
+ const struct compat_timeval __user *, t)
{
return compat_sys_futimesat(AT_FDCWD, filename, t);
}
diff --git a/fs/utimes.c b/fs/utimes.c
index 85c40f4..4954214 100644
--- a/fs/utimes.c
+++ b/fs/utimes.c
@@ -24,7 +24,8 @@
* must be owner or have write permission.
* Else, update from *times, must be owner or super user.
*/
-SYSCALL_DEFINE2(utime, char __user *, filename, struct utimbuf __user *, times)
+SYSCALL_DEFINE2(utime, const char __user *, filename,
+ const struct utimbuf __user *, times)
{
struct timespec tv[2];
@@ -48,7 +49,7 @@ static bool nsec_valid(long nsec)
return nsec >= 0 && nsec <= 999999999;
}
-static int utimes_common(struct path *path, struct timespec *times)
+static int utimes_common(struct path *path, const struct timespec *times)
{
int error;
struct iattr newattrs;
@@ -133,8 +134,8 @@ out:
* must be owner or have write permission.
* Else, update from *times, must be owner or super user.
*/
-long do_utimes(int dfd, const char __user *filename, struct timespec *times,
- int flags)
+long do_utimes(int dfd, const char __user *filename,
+ const struct timespec *times, int flags)
{
int error = -EINVAL;
@@ -183,7 +184,7 @@ out:
}
SYSCALL_DEFINE4(utimensat, int, dfd, const char __user *, filename,
- struct timespec __user *, utimes, int, flags)
+ const struct timespec __user *, utimes, int, flags)
{
struct timespec tstimes[2];
@@ -201,7 +202,7 @@ SYSCALL_DEFINE4(utimensat, int, dfd, const char __user *, filename,
}
SYSCALL_DEFINE3(futimesat, int, dfd, const char __user *, filename,
- struct timeval __user *, utimes)
+ const struct timeval __user *, utimes)
{
struct timeval times[2];
struct timespec tstimes[2];
@@ -228,8 +229,8 @@ SYSCALL_DEFINE3(futimesat, int, dfd, const char __user *, filename,
return do_utimes(dfd, filename, utimes ? tstimes : NULL, 0);
}
-SYSCALL_DEFINE2(utimes, char __user *, filename,
- struct timeval __user *, utimes)
+SYSCALL_DEFINE2(utimes, const char __user *, filename,
+ const struct timeval __user *, utimes)
{
return sys_futimesat(AT_FDCWD, filename, utimes);
}
diff --git a/include/linux/compat.h b/include/linux/compat.h
index f964ef7..def595d 100644
--- a/include/linux/compat.h
+++ b/include/linux/compat.h
@@ -461,10 +461,10 @@ asmlinkage long compat_sys_epoll_pwait(int epfd,
compat_size_t sigsetsize);
asmlinkage long compat_sys_utime(const char __user *filename,
- struct compat_utimbuf __user *t);
+ const struct compat_utimbuf __user *t);
asmlinkage long compat_sys_utimensat(unsigned int dfd,
const char __user *filename,
- struct compat_timespec __user *t,
+ const struct compat_timespec __user *t,
int flags);
asmlinkage long compat_sys_time(compat_time_t __user *tloc);
@@ -485,9 +485,9 @@ asmlinkage long compat_sys_move_pages(pid_t pid, compat_ulong_t nr_pages,
int flags);
asmlinkage long compat_sys_futimesat(unsigned int dfd,
const char __user *filename,
- struct compat_timeval __user *t);
+ const struct compat_timeval __user *t);
asmlinkage long compat_sys_utimes(const char __user *filename,
- struct compat_timeval __user *t);
+ const struct compat_timeval __user *t);
asmlinkage long compat_sys_newstat(const char __user *filename,
struct compat_stat __user *statbuf);
asmlinkage long compat_sys_newlstat(const char __user *filename,
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index d795472..3b83e59 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -550,10 +550,10 @@ asmlinkage long sys_getgid16(void);
asmlinkage long sys_getegid16(void);
#endif
-asmlinkage long sys_utime(char __user *filename,
- struct utimbuf __user *times);
-asmlinkage long sys_utimes(char __user *filename,
- struct timeval __user *utimes);
+asmlinkage long sys_utime(const char __user *filename,
+ const struct utimbuf __user *times);
+asmlinkage long sys_utimes(const char __user *filename,
+ const struct timeval __user *utimes);
asmlinkage long sys_lseek(unsigned int fd, off_t offset,
unsigned int whence);
asmlinkage long sys_llseek(unsigned int fd, unsigned long offset_high,
@@ -771,7 +771,7 @@ asmlinkage long sys_renameat2(int olddfd, const char __user *oldname,
int newdfd, const char __user *newname,
unsigned int flags);
asmlinkage long sys_futimesat(int dfd, const char __user *filename,
- struct timeval __user *utimes);
+ const struct timeval __user *utimes);
asmlinkage long sys_faccessat(int dfd, const char __user *filename, int mode);
asmlinkage long sys_fchmodat(int dfd, const char __user * filename,
umode_t mode);
@@ -784,7 +784,7 @@ asmlinkage long sys_newfstatat(int dfd, const char __user *filename,
asmlinkage long sys_readlinkat(int dfd, const char __user *path, char __user *buf,
int bufsiz);
asmlinkage long sys_utimensat(int dfd, const char __user *filename,
- struct timespec __user *utimes, int flags);
+ const struct timespec __user *utimes, int flags);
asmlinkage long sys_unshare(unsigned long unshare_flags);
asmlinkage long sys_splice(int fd_in, loff_t __user *off_in,
diff --git a/include/linux/time.h b/include/linux/time.h
index 297f09f..20b28fb 100644
--- a/include/linux/time.h
+++ b/include/linux/time.h
@@ -174,7 +174,8 @@ extern int do_getitimer(int which, struct itimerval *value);
extern unsigned int alarm_setitimer(unsigned int seconds);
-extern long do_utimes(int dfd, const char __user *filename, struct timespec *times, int flags);
+extern long do_utimes(int dfd, const char __user *filename,
+ const struct timespec *times, int flags);
struct tms;
extern void do_sys_times(struct tms *);
--
2.7.4