summaryrefslogtreecommitdiff
path: root/fs/compat.c
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2011-10-17 13:40:02 -0700
committerroot <root@serles.lst.de>2011-10-28 14:58:53 +0200
commit1448c721e4fa2faf742029a0403b4b787fccb7fa (patch)
treef79332dccc85550b4c16510840850e11115cfff0 /fs/compat.c
parenta877ee03ac010ded434b77f7831f43cbb1fcc60f (diff)
downloadlwn-1448c721e4fa2faf742029a0403b4b787fccb7fa.tar.gz
lwn-1448c721e4fa2faf742029a0403b4b787fccb7fa.zip
compat: sync compat_stats with statfs.
This was found by inspection while tracking a similar bug in compat_statfs64, that has been fixed in mainline since decemeber. - This fixes a bug where not all of the f_spare fields were cleared on mips and s390. - Add the f_flags field to struct compat_statfs - Copy f_flags to userspace in case someone cares. - Use __clear_user to copy the f_spare field to userspace to ensure that all of the elements of f_spare are cleared. On some architectures f_spare is has 5 ints and on some architectures f_spare only has 4 ints. Which makes the previous technique of clearing each int individually broken. I don't expect anyone actually uses the old statfs system call anymore but if they do let them benefit from having the compat and the native version working the same. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'fs/compat.c')
-rw-r--r--fs/compat.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/fs/compat.c b/fs/compat.c
index 58b1da459893..0f1ab468fa2d 100644
--- a/fs/compat.c
+++ b/fs/compat.c
@@ -247,11 +247,8 @@ static int put_compat_statfs(struct compat_statfs __user *ubuf, struct kstatfs *
__put_user(kbuf->f_fsid.val[0], &ubuf->f_fsid.val[0]) ||
__put_user(kbuf->f_fsid.val[1], &ubuf->f_fsid.val[1]) ||
__put_user(kbuf->f_frsize, &ubuf->f_frsize) ||
- __put_user(0, &ubuf->f_spare[0]) ||
- __put_user(0, &ubuf->f_spare[1]) ||
- __put_user(0, &ubuf->f_spare[2]) ||
- __put_user(0, &ubuf->f_spare[3]) ||
- __put_user(0, &ubuf->f_spare[4]))
+ __put_user(kbuf->f_flags, &ubuf->f_flags) ||
+ __clear_user(ubuf->f_spare, sizeof(ubuf->f_spare)))
return -EFAULT;
return 0;
}