From dc1e5c5f9d4a375f45c5757a5fda853cc54c3837 Mon Sep 17 00:00:00 2001 From: Barry Naujok Date: Tue, 2 Dec 2008 03:03:12 +0000 Subject: [PATCH] Linux kernels (at least up until 2.6.27) are lacking compat sys_ustat handlers on some platforms (notably PPC) so that if called from 32 bits on a 64-bit kernel, the kernel will copy out too much (32 bytes onto a 20-byte structure): [root@xero xfstests]# xfs_logprint /dev/loop0 xfs_logprint: *** stack smashing detected ***: xfs_logprint terminated Aborted This will be fixed upstream, but for the benefit of older kernels we may want to guard against this by padding the structure we pass into the syscall. We don't care about the values anyway, just the return value. Signed-off-by: Eric Sandeen Merge of master-melb:xfs-cmds:32618a by kenmcd. Pad ustat struct to avoid stack corruption --- libxfs/linux.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libxfs/linux.c b/libxfs/linux.c index 6022b7bbc..bc4990323 100644 --- a/libxfs/linux.c +++ b/libxfs/linux.c @@ -49,7 +49,8 @@ static int max_block_alignment; int platform_check_ismounted(char *name, char *block, struct stat64 *s, int verbose) { - struct ustat ust; + /* Pad ust; pre-2.6.28 linux copies out too much in 32bit compat mode */ + struct ustat ust[2]; struct stat64 st; if (!s) { @@ -60,7 +61,7 @@ platform_check_ismounted(char *name, char *block, struct stat64 *s, int verbose) s = &st; } - if (ustat(s->st_rdev, &ust) >= 0) { + if (ustat(s->st_rdev, ust) >= 0) { if (verbose) fprintf(stderr, _("%s: %s contains a mounted filesystem\n"), -- 2.47.2