summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@altlinux.org>2020-07-18 08:00:00 +0000
committerDmitry V. Levin <ldv@altlinux.org>2020-07-18 08:00:00 +0000
commitb8b11a1766567574cf884953e0fc69e5e2b0e7a3 (patch)
tree956a6457b714e96ac20a41408393d32d20e33338
parent2363c4d6f2ce40f5a93df4811c77c41ca5dde50d (diff)
downloadstrace-b8b11a1766567574cf884953e0fc69e5e2b0e7a3.tar.gz
Fix printing of syscall return value in octal mode
* defs.h (print_numeric_long_umask): Remove. * printmode.c (print_numeric_long_umask): Likewise. * syscall.c (syscall_exiting_trace) <case RVAL_OCTAL>: Fix printing of tcp->u_rval when sizeof(tcp->u_rval) > sizeof(long) or when sizeof(tcp->u_rval) > current_klongsize.
-rw-r--r--defs.h1
-rw-r--r--printmode.c6
-rw-r--r--syscall.c11
3 files changed, 9 insertions, 9 deletions
diff --git a/defs.h b/defs.h
index 81c0d0652..01b3c9b01 100644
--- a/defs.h
+++ b/defs.h
@@ -869,7 +869,6 @@ extern void print_uuid(const unsigned char *uuid);
extern void print_symbolic_mode_t(unsigned int);
extern void print_numeric_umode_t(unsigned short);
extern void print_numeric_ll_umode_t(unsigned long long);
-extern void print_numeric_long_umask(unsigned long);
extern void print_dev_t(unsigned long long dev);
extern void print_kernel_version(unsigned long version);
extern void print_abnormal_hi(kernel_ulong_t);
diff --git a/printmode.c b/printmode.c
index 075142adc..a53a6ce44 100644
--- a/printmode.c
+++ b/printmode.c
@@ -51,9 +51,3 @@ print_numeric_ll_umode_t(const unsigned long long mode)
{
tprintf("%#03llo", mode);
}
-
-void
-print_numeric_long_umask(const unsigned long mode)
-{
- tprintf("%#03lo", mode);
-}
diff --git a/syscall.c b/syscall.c
index 022cab5b4..bcc87025e 100644
--- a/syscall.c
+++ b/syscall.c
@@ -902,10 +902,17 @@ syscall_exiting_trace(struct tcb *tcp, struct timespec *ts, int res)
tprintf("= %#" PRI_klx, tcp->u_rval);
}
break;
- case RVAL_OCTAL:
+ case RVAL_OCTAL: {
+ unsigned long long mode =
+ zero_extend_signed_to_ull(tcp->u_rval);
tprints("= ");
- print_numeric_long_umask(tcp->u_rval);
+#if ANY_WORDSIZE_LESS_THAN_KERNEL_LONG
+ if (current_klongsize < sizeof(tcp->u_rval))
+ mode = (unsigned int) mode;
+#endif
+ print_numeric_ll_umode_t(mode);
break;
+ }
case RVAL_UDECIMAL:
#if ANY_WORDSIZE_LESS_THAN_KERNEL_LONG
if (current_klongsize < sizeof(tcp->u_rval)) {