* [PATCH] compat: sync compat_stats with statfs.
@ 2011-10-17 20:40 Eric W. Biederman
2011-10-19 22:28 ` Arnd Bergmann
0 siblings, 1 reply; 2+ messages in thread
From: Eric W. Biederman @ 2011-10-17 20:40 UTC (permalink / raw)
To: Al Viro, Christoph Hellwig
Cc: linux-arch, linux-fsdevel, Ralf Baechle, Martin Schwidefsky,
Heiko Carstens, Kyle McMartin
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>
---
arch/mips/include/asm/compat.h | 3 ++-
arch/parisc/include/asm/compat.h | 3 ++-
arch/powerpc/include/asm/compat.h | 3 ++-
arch/s390/include/asm/compat.h | 3 ++-
arch/sparc/include/asm/compat.h | 3 ++-
arch/x86/include/asm/compat.h | 3 ++-
fs/compat.c | 7 ++-----
7 files changed, 14 insertions(+), 11 deletions(-)
diff --git a/arch/mips/include/asm/compat.h b/arch/mips/include/asm/compat.h
index dbc5106..b77df03 100644
--- a/arch/mips/include/asm/compat.h
+++ b/arch/mips/include/asm/compat.h
@@ -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
diff --git a/arch/parisc/include/asm/compat.h b/arch/parisc/include/asm/compat.h
index efa0b60..760f331 100644
--- a/arch/parisc/include/asm/compat.h
+++ b/arch/parisc/include/asm/compat.h
@@ -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 {
diff --git a/arch/powerpc/include/asm/compat.h b/arch/powerpc/include/asm/compat.h
index 91010e8..88e602f 100644
--- a/arch/powerpc/include/asm/compat.h
+++ b/arch/powerpc/include/asm/compat.h
@@ -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
diff --git a/arch/s390/include/asm/compat.h b/arch/s390/include/asm/compat.h
index da359ca..cdb9b78 100644
--- a/arch/s390/include/asm/compat.h
+++ b/arch/s390/include/asm/compat.h
@@ -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
diff --git a/arch/sparc/include/asm/compat.h b/arch/sparc/include/asm/compat.h
index 6f57325..b8be20d 100644
--- a/arch/sparc/include/asm/compat.h
+++ b/arch/sparc/include/asm/compat.h
@@ -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
diff --git a/arch/x86/include/asm/compat.h b/arch/x86/include/asm/compat.h
index 1d9cd27..30d737e 100644
--- a/arch/x86/include/asm/compat.h
+++ b/arch/x86/include/asm/compat.h
@@ -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
diff --git a/fs/compat.c b/fs/compat.c
index 58b1da4..0f1ab46 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;
}
--
1.7.2.5
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] compat: sync compat_stats with statfs.
2011-10-17 20:40 [PATCH] compat: sync compat_stats with statfs Eric W. Biederman
@ 2011-10-19 22:28 ` Arnd Bergmann
0 siblings, 0 replies; 2+ messages in thread
From: Arnd Bergmann @ 2011-10-19 22:28 UTC (permalink / raw)
To: Eric W. Biederman
Cc: Al Viro, Christoph Hellwig, linux-arch, linux-fsdevel,
Ralf Baechle, Martin Schwidefsky, Heiko Carstens, Kyle McMartin
On Monday 17 October 2011 13:40:02 Eric W. Biederman wrote:
> 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>
Looks good to me.
Acked-by: Arnd Bergmann <arnd@arndb.de>
Apparently, this could have been worse on tile, which has
#define compat_statfs statfs, so that the old
"__put_user(0, &ubuf->f_spare[4]))" was writing beyond the
end of struct statfs. Fortunately, this never gets called
on tile, which only provides compat_sys_statfs64 to user space,
not compat_sys_statfs.
Arnd
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-10-19 22:28 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-10-17 20:40 [PATCH] compat: sync compat_stats with statfs Eric W. Biederman
2011-10-19 22:28 ` Arnd Bergmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).