Commit 9ad11ab4 authored by Stephen Rothwell's avatar Stephen Rothwell Committed by Linus Torvalds

[PATCH] compat: fix compat_sys_openat and friends

Most of the 64 bit architectures will zero extend the first argument to
compat_sys_{openat,newfstatat,futimesat} which will fail if the 32 bit
syscall was passed AT_FDCWD (which is a small negative number).  Declare
the first argument to be an unsigned int which will force the correct
sign extension when the internal functions are called in each case.

Also, do some small white space cleanups in fs/compat.c.
Signed-off-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>
Acked-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 8aeba3c6
...@@ -73,17 +73,17 @@ asmlinkage long compat_sys_utime(char __user *filename, struct compat_utimbuf __ ...@@ -73,17 +73,17 @@ asmlinkage long compat_sys_utime(char __user *filename, struct compat_utimbuf __
return do_utimes(AT_FDCWD, filename, t ? tv : NULL); return do_utimes(AT_FDCWD, filename, t ? tv : NULL);
} }
asmlinkage long compat_sys_futimesat(int dfd, char __user *filename, struct compat_timeval __user *t) asmlinkage long compat_sys_futimesat(unsigned int dfd, char __user *filename, struct compat_timeval __user *t)
{ {
struct timeval tv[2]; struct timeval tv[2];
if (t) { if (t) {
if (get_user(tv[0].tv_sec, &t[0].tv_sec) || if (get_user(tv[0].tv_sec, &t[0].tv_sec) ||
get_user(tv[0].tv_usec, &t[0].tv_usec) || get_user(tv[0].tv_usec, &t[0].tv_usec) ||
get_user(tv[1].tv_sec, &t[1].tv_sec) || get_user(tv[1].tv_sec, &t[1].tv_sec) ||
get_user(tv[1].tv_usec, &t[1].tv_usec)) get_user(tv[1].tv_usec, &t[1].tv_usec))
return -EFAULT; return -EFAULT;
} }
return do_utimes(dfd, filename, t ? tv : NULL); return do_utimes(dfd, filename, t ? tv : NULL);
} }
...@@ -114,7 +114,7 @@ asmlinkage long compat_sys_newlstat(char __user * filename, ...@@ -114,7 +114,7 @@ asmlinkage long compat_sys_newlstat(char __user * filename,
return error; return error;
} }
asmlinkage long compat_sys_newfstatat(int dfd, char __user *filename, asmlinkage long compat_sys_newfstatat(unsigned int dfd, char __user *filename,
struct compat_stat __user *statbuf, int flag) struct compat_stat __user *statbuf, int flag)
{ {
struct kstat stat; struct kstat stat;
...@@ -1326,7 +1326,7 @@ compat_sys_open(const char __user *filename, int flags, int mode) ...@@ -1326,7 +1326,7 @@ compat_sys_open(const char __user *filename, int flags, int mode)
* O_LARGEFILE flag. * O_LARGEFILE flag.
*/ */
asmlinkage long asmlinkage long
compat_sys_openat(int dfd, const char __user *filename, int flags, int mode) compat_sys_openat(unsigned int dfd, const char __user *filename, int flags, int mode)
{ {
return do_sys_open(dfd, filename, flags, mode); return do_sys_open(dfd, filename, flags, mode);
} }
......
...@@ -559,12 +559,12 @@ asmlinkage long sys_newfstatat(int dfd, char __user *filename, ...@@ -559,12 +559,12 @@ asmlinkage long sys_newfstatat(int dfd, char __user *filename,
struct stat __user *statbuf, int flag); struct stat __user *statbuf, int flag);
asmlinkage long sys_readlinkat(int dfd, const char __user *path, char __user *buf, asmlinkage long sys_readlinkat(int dfd, const char __user *path, char __user *buf,
int bufsiz); int bufsiz);
asmlinkage long compat_sys_futimesat(int dfd, char __user *filename, asmlinkage long compat_sys_futimesat(unsigned int dfd, char __user *filename,
struct compat_timeval __user *t); struct compat_timeval __user *t);
asmlinkage long compat_sys_newfstatat(int dfd, char __user * filename, asmlinkage long compat_sys_newfstatat(unsigned int dfd, char __user * filename,
struct compat_stat __user *statbuf, struct compat_stat __user *statbuf,
int flag); int flag);
asmlinkage long compat_sys_openat(int dfd, const char __user *filename, asmlinkage long compat_sys_openat(unsigned int dfd, const char __user *filename,
int flags, int mode); int flags, int mode);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment