From: Dmitry V. Levin Date: Sat, 20 May 2017 20:17:59 +0000 (+0000) Subject: Fix compat personality support for old sigsuspend syscall X-Git-Tag: v4.17~10 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=eb446e3cd86cbdfd61695695165ac200cdc96728;p=strace Fix compat personality support for old sigsuspend syscall * signal.c (sprint_old_sigmask_val): New function. (tprint_old_sigmask_val): New macro. (SYS_FUNC(sigsuspend)): Use it. --- diff --git a/signal.c b/signal.c index 04ed10cb..321b507a 100644 --- a/signal.c +++ b/signal.c @@ -230,6 +230,24 @@ sprintsigmask_n(const char *prefix, const void *sig_mask, unsigned int bytes) #define tprintsigmask_val(prefix, mask) \ tprints(sprintsigmask_n((prefix), &(mask), sizeof(mask))) +static const char * +sprint_old_sigmask_val(const char *const prefix, const unsigned long mask) +{ +#if defined(current_wordsize) || !defined(WORDS_BIGENDIAN) + return sprintsigmask_n(prefix, &mask, current_wordsize); +#else /* !current_wordsize && WORDS_BIGENDIAN */ + if (current_wordsize == sizeof(mask)) { + return sprintsigmask_val(prefix, mask); + } else { + uint32_t mask32 = mask; + return sprintsigmask_val(prefix, mask32); + } +#endif +} + +#define tprint_old_sigmask_val(prefix, mask) \ + tprints(sprint_old_sigmask_val((prefix), (mask))) + void printsignal(int nr) { @@ -389,7 +407,7 @@ SYS_FUNC(sigsuspend) print_sigset_addr_len(tcp, tcp->u_arg[tcp->s_ent->nargs - 1], current_wordsize); #else - tprintsigmask_val("", tcp->u_arg[tcp->s_ent->nargs - 1]); + tprint_old_sigmask_val("", tcp->u_arg[tcp->s_ent->nargs - 1]); #endif return RVAL_DECODED;