diff options
author | James Hogan <james.hogan@imgtec.com> | 2014-05-02 14:15:41 +0100 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2014-05-21 00:22:07 +0000 |
commit | 3b09ebe724b1ee233ce2314a8b70a4dfdf9d2b07 (patch) | |
tree | 3a8ea6708542cd67ab1c9be58906b2fc1d9fffc1 | |
parent | b2ede14797b729659b0397431b28f34e57b5c4e7 (diff) | |
download | strace-3b09ebe724b1ee233ce2314a8b70a4dfdf9d2b07.tar.gz strace-3b09ebe724b1ee233ce2314a8b70a4dfdf9d2b07.tar.bz2 strace-3b09ebe724b1ee233ce2314a8b70a4dfdf9d2b07.tar.xz |
When strace is built with large file support definitions in CFLAGS (as
may be provided by buildroot) the C library headers may expose a 64-bit
rlim_t even though the struct rlimit fields used by the system call
interface are only 32-bit. The SIZEOF_RLIM_T will then be 8 which
results in bad decoding of the getrlimit and setrlimit syscalls.
This is fixed by replacing unreliable SIZEOF_RLIM_T based checks with
checks for current_wordsize.
Signed-off-by: James Hogan <james.hogan@imgtec.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | defs.h | 2 | ||||
-rw-r--r-- | resource.c | 22 |
3 files changed, 13 insertions, 12 deletions
diff --git a/configure.ac b/configure.ac index 0969173..e5c837b 100644 --- a/configure.ac +++ b/configure.ac @@ -309,7 +309,6 @@ AC_CACHE_CHECK([for BLKGETSIZE64], [ac_cv_have_blkgetsize64], AC_CHECK_SIZEOF([long]) AC_CHECK_SIZEOF([long long]) AC_CHECK_SIZEOF([off_t],,[#include <sys/types.h>]) -AC_CHECK_SIZEOF([rlim_t],,[#include <sys/resource.h>]) AC_CACHE_CHECK([for SA_RESTORER], [st_cv_sa_restorer], [st_cv_sa_restorer="$(echo SA_RESTORER | @@ -370,7 +370,7 @@ struct arm_pt_regs { # define DEFAULT_PERSONALITY 0 #endif #ifndef PERSONALITY0_WORDSIZE -# define PERSONALITY0_WORDSIZE (int)(sizeof(long)) +# define PERSONALITY0_WORDSIZE SIZEOF_LONG #endif #if defined(I386) || defined(X86_64) @@ -88,10 +88,6 @@ static const struct xlat resources[] = { XLAT_END }; -#if !(SIZEOF_RLIM_T == 4 || SIZEOF_RLIM_T == 8) -# error "Unsupported SIZEOF_RLIM_T value" -#endif - static const char * sprint_rlim64(uint64_t lim) { @@ -135,7 +131,7 @@ decode_rlimit64(struct tcb *tcp, unsigned long addr) print_rlimit64(tcp, addr); } -#if SIZEOF_RLIM_T == 4 || SUPPORTED_PERSONALITIES > 1 +#if !defined(current_wordsize) || current_wordsize == 4 static const char * sprint_rlim32(uint32_t lim) @@ -176,22 +172,28 @@ decode_rlimit(struct tcb *tcp, unsigned long addr) else if (!verbose(tcp) || (exiting(tcp) && syserror(tcp))) tprintf("%#lx", addr); else { -# if SIZEOF_RLIM_T == 4 - print_rlimit32(tcp, addr); +# if defined(X86_64) || defined(X32) + /* + * i386 is the only personality on X86_64 and X32 + * with 32-bit rlim_t. + * When current_personality is X32, current_wordsize + * equals to 4 but rlim_t is 64-bit. + */ + if (current_personality == 1) # else if (current_wordsize == 4) +# endif print_rlimit32(tcp, addr); else print_rlimit64(tcp, addr); -# endif } } -#else /* SIZEOF_RLIM_T == 8 && SUPPORTED_PERSONALITIES == 1 */ +#else /* defined(current_wordsize) && current_wordsize != 4 */ # define decode_rlimit decode_rlimit64 -#endif /* SIZEOF_RLIM_T == 4 || SUPPORTED_PERSONALITIES > 1 */ +#endif int sys_getrlimit(struct tcb *tcp) |