Skip to content

Commit

Permalink
compat: sync compat_stats with statfs.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
ebiederm authored and root committed Oct 28, 2011
1 parent a877ee0 commit 1448c72
Show file tree
Hide file tree
Showing 7 changed files with 14 additions and 11 deletions.
3 changes: 2 additions & 1 deletion arch/mips/include/asm/compat.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion arch/parisc/include/asm/compat.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
3 changes: 2 additions & 1 deletion arch/powerpc/include/asm/compat.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion arch/s390/include/asm/compat.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion arch/sparc/include/asm/compat.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion arch/x86/include/asm/compat.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
7 changes: 2 additions & 5 deletions fs/compat.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down

0 comments on commit 1448c72

Please sign in to comment.