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>
This commit is contained in:
parent
a877ee03ac
commit
1448c721e4
@ -111,7 +111,8 @@ struct compat_statfs {
|
||||
int f_bavail;
|
||||
compat_fsid_t f_fsid;
|
||||
int f_namelen;
|
||||
int f_spare[6];
|
||||
int f_flags;
|
||||
int f_spare[5];
|
||||
};
|
||||
|
||||
#define COMPAT_RLIM_INFINITY 0x7fffffffUL
|
||||
|
@ -105,7 +105,8 @@ struct compat_statfs {
|
||||
__kernel_fsid_t f_fsid;
|
||||
s32 f_namelen;
|
||||
s32 f_frsize;
|
||||
s32 f_spare[5];
|
||||
s32 f_flags;
|
||||
s32 f_spare[4];
|
||||
};
|
||||
|
||||
struct compat_sigcontext {
|
||||
|
@ -100,7 +100,8 @@ struct compat_statfs {
|
||||
compat_fsid_t f_fsid;
|
||||
int f_namelen; /* SunOS ignores this field. */
|
||||
int f_frsize;
|
||||
int f_spare[5];
|
||||
int f_flags;
|
||||
int f_spare[4];
|
||||
};
|
||||
|
||||
#define COMPAT_RLIM_OLD_INFINITY 0x7fffffff
|
||||
|
@ -131,7 +131,8 @@ struct compat_statfs {
|
||||
compat_fsid_t f_fsid;
|
||||
s32 f_namelen;
|
||||
s32 f_frsize;
|
||||
s32 f_spare[6];
|
||||
s32 f_flags;
|
||||
s32 f_spare[5];
|
||||
};
|
||||
|
||||
#define COMPAT_RLIM_OLD_INFINITY 0x7fffffff
|
||||
|
@ -134,7 +134,8 @@ struct compat_statfs {
|
||||
compat_fsid_t f_fsid;
|
||||
int f_namelen; /* SunOS ignores this field. */
|
||||
int f_frsize;
|
||||
int f_spare[5];
|
||||
int f_flags;
|
||||
int f_spare[4];
|
||||
};
|
||||
|
||||
#define COMPAT_RLIM_INFINITY 0x7fffffff
|
||||
|
@ -108,7 +108,8 @@ struct compat_statfs {
|
||||
compat_fsid_t f_fsid;
|
||||
int f_namelen; /* SunOS ignores this field. */
|
||||
int f_frsize;
|
||||
int f_spare[5];
|
||||
int f_flags;
|
||||
int f_spare[4];
|
||||
};
|
||||
|
||||
#define COMPAT_RLIM_OLD_INFINITY 0x7fffffff
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user