Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1448c721 authored by Eric W. Biederman's avatar Eric W. Biederman Committed by root
Browse files

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: default avatarEric W. Biederman <ebiederm@xmission.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent a877ee03
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -111,7 +111,8 @@ struct compat_statfs {
	int		f_bavail;
	int		f_bavail;
	compat_fsid_t	f_fsid;
	compat_fsid_t	f_fsid;
	int		f_namelen;
	int		f_namelen;
	int		f_spare[6];
	int		f_flags;
	int		f_spare[5];
};
};


#define COMPAT_RLIM_INFINITY	0x7fffffffUL
#define COMPAT_RLIM_INFINITY	0x7fffffffUL
+2 −1
Original line number Original line Diff line number Diff line
@@ -105,7 +105,8 @@ struct compat_statfs {
	__kernel_fsid_t	f_fsid;
	__kernel_fsid_t	f_fsid;
	s32		f_namelen;
	s32		f_namelen;
	s32		f_frsize;
	s32		f_frsize;
	s32		f_spare[5];
	s32		f_flags;
	s32		f_spare[4];
};
};


struct compat_sigcontext {
struct compat_sigcontext {
+2 −1
Original line number Original line Diff line number Diff line
@@ -100,7 +100,8 @@ struct compat_statfs {
	compat_fsid_t	f_fsid;
	compat_fsid_t	f_fsid;
	int		f_namelen;	/* SunOS ignores this field. */
	int		f_namelen;	/* SunOS ignores this field. */
	int		f_frsize;
	int		f_frsize;
	int		f_spare[5];
	int		f_flags;
	int		f_spare[4];
};
};


#define COMPAT_RLIM_OLD_INFINITY	0x7fffffff
#define COMPAT_RLIM_OLD_INFINITY	0x7fffffff
+2 −1
Original line number Original line Diff line number Diff line
@@ -131,7 +131,8 @@ struct compat_statfs {
	compat_fsid_t	f_fsid;
	compat_fsid_t	f_fsid;
	s32		f_namelen;
	s32		f_namelen;
	s32		f_frsize;
	s32		f_frsize;
	s32		f_spare[6];
	s32		f_flags;
	s32		f_spare[5];
};
};


#define COMPAT_RLIM_OLD_INFINITY	0x7fffffff
#define COMPAT_RLIM_OLD_INFINITY	0x7fffffff
+2 −1
Original line number Original line Diff line number Diff line
@@ -134,7 +134,8 @@ struct compat_statfs {
	compat_fsid_t	f_fsid;
	compat_fsid_t	f_fsid;
	int		f_namelen;	/* SunOS ignores this field. */
	int		f_namelen;	/* SunOS ignores this field. */
	int		f_frsize;
	int		f_frsize;
	int		f_spare[5];
	int		f_flags;
	int		f_spare[4];
};
};


#define COMPAT_RLIM_INFINITY 0x7fffffff
#define COMPAT_RLIM_INFINITY 0x7fffffff
Loading