summaryrefslogtreecommitdiff
path: root/resource.c
diff options
context:
space:
mode:
authorJames Hogan <james.hogan@imgtec.com>2014-05-02 14:15:41 +0100
committerDmitry V. Levin <ldv@altlinux.org>2014-05-21 00:22:07 +0000
commit3b09ebe724b1ee233ce2314a8b70a4dfdf9d2b07 (patch)
tree3a8ea6708542cd67ab1c9be58906b2fc1d9fffc1 /resource.c
parentb2ede14797b729659b0397431b28f34e57b5c4e7 (diff)
downloadstrace-3b09ebe724b1ee233ce2314a8b70a4dfdf9d2b07.tar.gz
strace-3b09ebe724b1ee233ce2314a8b70a4dfdf9d2b07.tar.bz2
strace-3b09ebe724b1ee233ce2314a8b70a4dfdf9d2b07.tar.xz
Fix {get,set}rlimit decoding with unreliable SIZEOF_RLIM_THEADmaster
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>
Diffstat (limited to 'resource.c')
-rw-r--r--resource.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/resource.c b/resource.c
index 5f92b39..b62f631 100644
--- a/resource.c
+++ b/resource.c
@@ -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)