From: Denys Vlasenko Date: Fri, 15 Feb 2013 13:58:52 +0000 (+0100) Subject: Macroize conditional signed widening operation X-Git-Tag: v4.8~158 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e015d2d331c75b912e3dd96532e2c31ae0e06554;p=strace Macroize conditional signed widening operation * defs.h: Define widen_to_long() macro. * signal.c (sys_kill): Use it instead of open-coding it. (sys_tgkill): Use widen_to_long() on pids. * resource.c (decode_rlimit): Formatting fix. Signed-off-by: Denys Vlasenko --- diff --git a/defs.h b/defs.h index 7702aaed..c607dfd7 100644 --- a/defs.h +++ b/defs.h @@ -723,6 +723,16 @@ extern unsigned current_wordsize; # endif #endif +/* In many, many places we play fast and loose and use + * tprintf("%d", (int) tcp->u_arg[N]) to print fds, pids etc. + * We probably need to use widen_to_long() instead: + */ +#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4 +# define widen_to_long(v) (current_wordsize == 4 ? (long)(int32_t)(v) : (long)(v)) +#else +# define widen_to_long(v) ((long)(v)) +#endif + struct sysent { unsigned nargs; int sys_flags; diff --git a/resource.c b/resource.c index 5a51d8cb..657e63de 100644 --- a/resource.c +++ b/resource.c @@ -173,8 +173,7 @@ decode_rlimit(struct tcb *tcp, unsigned long addr) { if (!addr) tprints("NULL"); - else if (!verbose(tcp) || - (exiting(tcp) && syserror(tcp))) + else if (!verbose(tcp) || (exiting(tcp) && syserror(tcp))) tprintf("%#lx", addr); else { # if SIZEOF_RLIM_T == 4 diff --git a/signal.c b/signal.c index 55ff3ed7..11d49d33 100644 --- a/signal.c +++ b/signal.c @@ -1117,13 +1117,10 @@ int sys_kill(struct tcb *tcp) { if (entering(tcp)) { - long pid = tcp->u_arg[0]; -#if SUPPORTED_PERSONALITIES > 1 - /* Sign-extend a 32-bit value when that's what it is. */ - if (current_wordsize < sizeof pid) - pid = (long) (int) pid; -#endif - tprintf("%ld, %s", pid, signame(tcp->u_arg[1])); + tprintf("%ld, %s", + widen_to_long(tcp->u_arg[0]), + signame(tcp->u_arg[1]) + ); } return 0; } @@ -1133,7 +1130,10 @@ sys_tgkill(struct tcb *tcp) { if (entering(tcp)) { tprintf("%ld, %ld, %s", - tcp->u_arg[0], tcp->u_arg[1], signame(tcp->u_arg[2])); + widen_to_long(tcp->u_arg[0]), + widen_to_long(tcp->u_arg[1]), + signame(tcp->u_arg[2]) + ); } return 0; }