From: Dmitry V. Levin Date: Tue, 27 Dec 2016 23:32:44 +0000 (+0000) Subject: Introduce NSIG_BYTES X-Git-Tag: v4.16~136 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e9c702f9ad37d37ebab85b7c393a780b2da5755d;p=strace Introduce NSIG_BYTES * nsig.h (NSIG_BYTES): New macro. * desc.c: Use it in comments instead of NSIG. * epoll.c: Likewise. * poll.c: Likewise. * signalfd.c: Likewise. * signal.c: Likewise. (sprintsigmask_n, print_sigset_addr_len_limit): Use it instead of NSIG. * linux/alpha/arch_sigreturn.c (arch_sigreturn): Likewise. * linux/arm/arch_sigreturn.c (arch_sigreturn): Likewise. * linux/crisv10/arch_sigreturn.c (arch_sigreturn): Likewise. * linux/ia64/arch_sigreturn.c (arch_sigreturn): Likewise. * linux/m68k/arch_sigreturn.c (arch_sigreturn): Likewise. * linux/microblaze/arch_sigreturn.c (arch_sigreturn): Likewise. * linux/mips/arch_sigreturn.c (arch_sigreturn): Likewise. * linux/powerpc/arch_sigreturn.c (arch_sigreturn): Likewise. * linux/s390/arch_sigreturn.c (arch_sigreturn): Likewise. * linux/sparc/arch_sigreturn.c (arch_sigreturn): Likewise. * linux/tile/arch_sigreturn.c (arch_sigreturn): Likewise. * linux/x86_64/arch_sigreturn.c (arch_sigreturn): Likewise. * tests/pselect6.c (main): Likewise. --- diff --git a/desc.c b/desc.c index 24d657fa..48824697 100644 --- a/desc.c +++ b/desc.c @@ -256,7 +256,7 @@ SYS_FUNC(pselect6) if (!umove_kulong_array_or_printaddr(tcp, tcp->u_arg[5], data, ARRAY_SIZE(data))) { tprints("{"); - /* NB: kernel requires data[1] == NSIG / 8 */ + /* NB: kernel requires data[1] == NSIG_BYTES */ print_sigset_addr_len(tcp, data[0], data[1]); tprintf(", %" PRI_klu "}", data[1]); } diff --git a/epoll.c b/epoll.c index ee549914..8dc7ab09 100644 --- a/epoll.c +++ b/epoll.c @@ -109,7 +109,7 @@ SYS_FUNC(epoll_pwait) epoll_wait_common(tcp); if (exiting(tcp)) { tprints(", "); - /* NB: kernel requires arg[5] == NSIG / 8 */ + /* NB: kernel requires arg[5] == NSIG_BYTES */ print_sigset_addr_len(tcp, tcp->u_arg[4], tcp->u_arg[5]); tprintf(", %" PRI_klu, tcp->u_arg[5]); } diff --git a/linux/alpha/arch_sigreturn.c b/linux/alpha/arch_sigreturn.c index 320f91f9..3317a954 100644 --- a/linux/alpha/arch_sigreturn.c +++ b/linux/alpha/arch_sigreturn.c @@ -8,6 +8,6 @@ arch_sigreturn(struct tcb *tcp) addr += offsetof(struct sigcontext, sc_mask); tprints("{mask="); - print_sigset_addr_len(tcp, addr, NSIG / 8); + print_sigset_addr_len(tcp, addr, NSIG_BYTES); tprints("}"); } diff --git a/linux/arm/arch_sigreturn.c b/linux/arm/arch_sigreturn.c index 9a8584eb..378ba67f 100644 --- a/linux/arm/arch_sigreturn.c +++ b/linux/arm/arch_sigreturn.c @@ -14,6 +14,6 @@ arch_sigreturn(struct tcb *tcp) (*arm_sp_ptr + OFFSETOF_STRUCT_UCONTEXT_UC_SIGMASK); tprints("{mask="); - print_sigset_addr_len(tcp, addr, NSIG / 8); + print_sigset_addr_len(tcp, addr, NSIG_BYTES); tprints("}"); } diff --git a/linux/crisv10/arch_sigreturn.c b/linux/crisv10/arch_sigreturn.c index d45e3bac..b449d41e 100644 --- a/linux/crisv10/arch_sigreturn.c +++ b/linux/crisv10/arch_sigreturn.c @@ -11,6 +11,6 @@ arch_sigreturn(struct tcb *tcp) regs[PT_USP] + offsetof(struct sigcontext, oldmask); tprints("{mask="); - print_sigset_addr_len(tcp, addr, NSIG / 8); + print_sigset_addr_len(tcp, addr, NSIG_BYTES); tprints("}"); } diff --git a/linux/ia64/arch_sigreturn.c b/linux/ia64/arch_sigreturn.c index 352ca682..0c0034f9 100644 --- a/linux/ia64/arch_sigreturn.c +++ b/linux/ia64/arch_sigreturn.c @@ -7,6 +7,6 @@ arch_sigreturn(struct tcb *tcp) OFFSETOF_STRUCT_SIGFRAME_SC + offsetof(struct sigcontext, sc_mask); tprints("{mask="); - print_sigset_addr_len(tcp, addr, NSIG / 8); + print_sigset_addr_len(tcp, addr, NSIG_BYTES); tprints("}"); } diff --git a/linux/m68k/arch_sigreturn.c b/linux/m68k/arch_sigreturn.c index ff323458..b1402683 100644 --- a/linux/m68k/arch_sigreturn.c +++ b/linux/m68k/arch_sigreturn.c @@ -7,7 +7,7 @@ arch_sigreturn(struct tcb *tcp) if (umove(tcp, *m68k_usp_ptr + 2 * sizeof(int), &addr) < 0) return; - unsigned long mask[NSIG / 8 / sizeof(long)]; + unsigned long mask[NSIG_BYTES / sizeof(long)]; /* Fetch first word of signal mask. */ if (umove(tcp, addr, &mask[0]) < 0) return; diff --git a/linux/microblaze/arch_sigreturn.c b/linux/microblaze/arch_sigreturn.c index c8948153..6eb7cd8e 100644 --- a/linux/microblaze/arch_sigreturn.c +++ b/linux/microblaze/arch_sigreturn.c @@ -11,6 +11,6 @@ arch_sigreturn(struct tcb *tcp) addr += offsetof(struct sigcontext, oldmask); tprints("{mask="); - print_sigset_addr_len(tcp, addr, NSIG / 8); + print_sigset_addr_len(tcp, addr, NSIG_BYTES); tprints("}"); } diff --git a/linux/mips/arch_sigreturn.c b/linux/mips/arch_sigreturn.c index 14203093..72f7619b 100644 --- a/linux/mips/arch_sigreturn.c +++ b/linux/mips/arch_sigreturn.c @@ -21,6 +21,6 @@ arch_sigreturn(struct tcb *tcp) #endif tprints("{mask="); - print_sigset_addr_len(tcp, addr, NSIG / 8); + print_sigset_addr_len(tcp, addr, NSIG_BYTES); tprints("}"); } diff --git a/linux/powerpc/arch_sigreturn.c b/linux/powerpc/arch_sigreturn.c index 644e0502..4f68648d 100644 --- a/linux/powerpc/arch_sigreturn.c +++ b/linux/powerpc/arch_sigreturn.c @@ -15,7 +15,7 @@ arch_sigreturn(struct tcb *tcp) if (umove(tcp, addr, &sc) < 0) { tprintf("{mask=%#lx}", addr); } else { - unsigned long mask[NSIG / 8 / sizeof(long)]; + unsigned long mask[NSIG_BYTES / sizeof(long)]; #ifdef POWERPC64 mask[0] = sc.oldmask | (sc._unused[3] << 32); #else diff --git a/linux/s390/arch_sigreturn.c b/linux/s390/arch_sigreturn.c index 3990ae6f..d1b85986 100644 --- a/linux/s390/arch_sigreturn.c +++ b/linux/s390/arch_sigreturn.c @@ -1,7 +1,7 @@ static void arch_sigreturn(struct tcb *tcp) { - unsigned long mask[NSIG / 8 / sizeof(long)]; + unsigned long mask[NSIG_BYTES / sizeof(long)]; const unsigned long addr = *s390_frame_ptr + __SIGNAL_FRAMESIZE; if (umove(tcp, addr, &mask) < 0) { diff --git a/linux/sparc/arch_sigreturn.c b/linux/sparc/arch_sigreturn.c index dca44143..2170a7ba 100644 --- a/linux/sparc/arch_sigreturn.c +++ b/linux/sparc/arch_sigreturn.c @@ -17,13 +17,13 @@ arch_sigreturn(struct tcb *tcp) unsigned int mask; char fpu_save[PERSONALITY_WORDSIZE]; char insns[PERSONALITY_WORDSIZE * 2] ATTRIBUTE_ALIGNED(8); - unsigned int extramask[NSIG / 8 / sizeof(int) - 1]; + unsigned int extramask[NSIG_BYTES / sizeof(int) - 1]; } frame; if (umove(tcp, addr, &frame) < 0) { tprintf("{mask=%#lx}", addr); } else { - unsigned int mask[NSIG / 8 / sizeof(int)]; + unsigned int mask[NSIG_BYTES / sizeof(int)]; mask[0] = frame.mask; memcpy(mask + 1, frame.extramask, sizeof(frame.extramask)); diff --git a/linux/tile/arch_sigreturn.c b/linux/tile/arch_sigreturn.c index 53a3fbbe..88e946f0 100644 --- a/linux/tile/arch_sigreturn.c +++ b/linux/tile/arch_sigreturn.c @@ -7,6 +7,6 @@ arch_sigreturn(struct tcb *tcp) offsetof(struct ucontext, uc_sigmask); tprints("{mask="); - print_sigset_addr_len(tcp, addr, NSIG / 8); + print_sigset_addr_len(tcp, addr, NSIG_BYTES); tprints("}"); } diff --git a/linux/x86_64/arch_sigreturn.c b/linux/x86_64/arch_sigreturn.c index 6a161e6e..060b93a7 100644 --- a/linux/x86_64/arch_sigreturn.c +++ b/linux/x86_64/arch_sigreturn.c @@ -27,6 +27,6 @@ arch_sigreturn(struct tcb *tcp) #endif const kernel_ulong_t addr = (kernel_ulong_t) *x86_64_rsp_ptr + offset; tprints("{mask="); - print_sigset_addr_len(tcp, addr, NSIG / 8); + print_sigset_addr_len(tcp, addr, NSIG_BYTES); tprints("}"); } diff --git a/nsig.h b/nsig.h index 4b000424..528f7033 100644 --- a/nsig.h +++ b/nsig.h @@ -10,4 +10,6 @@ # error NSIG < 32 #endif +#define NSIG_BYTES (NSIG / 8) + #endif /* !STRACE_NSIG_H */ diff --git a/poll.c b/poll.c index b2d2771c..f2a23814 100644 --- a/poll.c +++ b/poll.c @@ -176,7 +176,7 @@ SYS_FUNC(ppoll) print_timespec(tcp, tcp->u_arg[2]); tprints(", "); - /* NB: kernel requires arg[4] == NSIG / 8 */ + /* NB: kernel requires arg[4] == NSIG_BYTES */ print_sigset_addr_len(tcp, tcp->u_arg[3], tcp->u_arg[4]); tprintf(", %" PRI_klu, tcp->u_arg[4]); diff --git a/signal.c b/signal.c index 4e18c6a0..2a425b13 100644 --- a/signal.c +++ b/signal.c @@ -104,7 +104,7 @@ * umoven(tcp, addr, sizeof(sigset_t), &sigset) * may be a bad idea: it'll try to read much more data than needed * to fetch a sigset_t. - * Use (NSIG / 8) as a size instead. + * Use NSIG_BYTES as a size instead. */ static const char * @@ -168,16 +168,17 @@ const char * sprintsigmask_n(const char *prefix, const void *sig_mask, unsigned int bytes) { /* - * The maximum number of signal names to be printed is NSIG * 2 / 3. + * The maximum number of signal names to be printed + * is NSIG_BYTES * 8 * 2 / 3. * Most of signal names have length 7, * average length of signal names is less than 7. * The length of prefix string does not exceed 16. */ - static char outstr[128 + 8 * (NSIG * 2 / 3)]; + static char outstr[128 + 8 * (NSIG_BYTES * 8 * 2 / 3)]; char *s; const uint32_t *mask; - uint32_t inverted_mask[NSIG / 32]; + uint32_t inverted_mask[NSIG_BYTES / 4]; unsigned int size; int i; char sep; @@ -186,10 +187,10 @@ sprintsigmask_n(const char *prefix, const void *sig_mask, unsigned int bytes) mask = sig_mask; /* length of signal mask in 4-byte words */ - size = (bytes >= NSIG / 8) ? NSIG / 32 : (bytes + 3) / 4; + size = (bytes >= NSIG_BYTES) ? NSIG_BYTES / 4 : (bytes + 3) / 4; /* check whether 2/3 or more bits are set */ - if (popcount32(mask, size) >= size * 32 * 2 / 3) { + if (popcount32(mask, size) >= size * (4 * 8) * 2 / 3) { /* show those signals that are NOT in the mask */ unsigned int j; for (j = 0; j < size; ++j) @@ -199,7 +200,7 @@ sprintsigmask_n(const char *prefix, const void *sig_mask, unsigned int bytes) } sep = '['; - for (i = 0; (i = next_set_bit(mask, i, size * 32)) >= 0; ) { + for (i = 0; (i = next_set_bit(mask, i, size * (4 * 8))) >= 0; ) { ++i; *s++ = sep; if ((unsigned) i < nsignals) { @@ -239,14 +240,14 @@ print_sigset_addr_len_limit(struct tcb *const tcp, const kernel_ulong_t addr, const kernel_ulong_t len, const unsigned int min_len) { /* - * Here len is usually equal to NSIG / 8 or current_wordsize. + * Here len is usually equal to NSIG_BYTES or current_wordsize. * But we code this defensively: */ - if (len < min_len || len > NSIG / 8) { + if (len < min_len || len > NSIG_BYTES) { printaddr(addr); return; } - int mask[NSIG / 8 / sizeof(int)] = {}; + int mask[NSIG_BYTES / sizeof(int)] = {}; if (umoven_or_printaddr(tcp, addr, len, mask)) return; tprints(sprintsigmask_n("", mask, len)); @@ -447,7 +448,7 @@ SYS_FUNC(sigpending) SYS_FUNC(rt_sigprocmask) { - /* Note: arg[3] is the length of the sigset. Kernel requires NSIG / 8 */ + /* Note: arg[3] is the length of the sigset. Kernel requires NSIG_BYTES */ if (entering(tcp)) { printxval(sigprocmaskcmds, tcp->u_arg[0], "SIG_???"); tprints(", "); @@ -529,7 +530,7 @@ decode_new_sigaction(struct tcb *const tcp, const kernel_ulong_t addr) * or in tcp->u_arg[3] (all other), * but kernel won't handle sys_rt_sigaction * with wrong sigset size (just returns EINVAL instead). - * We just fetch the right size, which is NSIG / 8. + * We just fetch the right size, which is NSIG_BYTES. */ tprintsigmask_val("", sa.sa_mask); tprints(", sa_flags="); @@ -569,7 +570,7 @@ SYS_FUNC(rt_sigpending) if (exiting(tcp)) { /* * One of the few syscalls where sigset size (arg[1]) - * is allowed to be <= NSIG / 8, not strictly ==. + * is allowed to be <= NSIG_BYTES, not strictly ==. * This allows non-rt sigpending() syscall * to reuse rt_sigpending() code in kernel. */ @@ -582,7 +583,7 @@ SYS_FUNC(rt_sigpending) SYS_FUNC(rt_sigsuspend) { - /* NB: kernel requires arg[1] == NSIG / 8 */ + /* NB: kernel requires arg[1] == NSIG_BYTES */ print_sigset_addr_len(tcp, tcp->u_arg[0], tcp->u_arg[1]); tprintf(", %" PRI_klu, tcp->u_arg[1]); @@ -616,7 +617,7 @@ SYS_FUNC(rt_tgsigqueueinfo) SYS_FUNC(rt_sigtimedwait) { - /* NB: kernel requires arg[3] == NSIG / 8 */ + /* NB: kernel requires arg[3] == NSIG_BYTES */ if (entering(tcp)) { print_sigset_addr_len(tcp, tcp->u_arg[0], tcp->u_arg[3]); tprints(", "); diff --git a/signalfd.c b/signalfd.c index f4631ad9..3895c766 100644 --- a/signalfd.c +++ b/signalfd.c @@ -36,7 +36,7 @@ static int do_signalfd(struct tcb *tcp, int flags_arg) { - /* NB: kernel requires arg[2] == NSIG / 8 */ + /* NB: kernel requires arg[2] == NSIG_BYTES */ printfd(tcp, tcp->u_arg[0]); tprints(", "); print_sigset_addr_len(tcp, tcp->u_arg[1], tcp->u_arg[2]); diff --git a/tests/pselect6.c b/tests/pselect6.c index f8f10f54..f2644853 100644 --- a/tests/pselect6.c +++ b/tests/pselect6.c @@ -85,7 +85,7 @@ int main(int ac, char **av) "= 1 (out [%d])\n", fds[1] + 1, fds[0], fds[1], fds[0], fds[1], - NSIG / 8, fds[1]); + NSIG_BYTES, fds[1]); /* * Another simple one, with a timeout. @@ -111,7 +111,7 @@ int main(int ac, char **av) FD_SET(fds[1],set[0]); assert(pselect(-1, NULL, set[0], NULL, NULL, &mask) == -1); printf("pselect6(-1, NULL, %p, NULL, NULL, {[HUP CHLD], %u}) " - "= -1 EINVAL (%m)\n", set[0], NSIG / 8); + "= -1 EINVAL (%m)\n", set[0], NSIG_BYTES); /* * Another variant, with nfds exceeding FD_SETSIZE limit. @@ -124,7 +124,7 @@ int main(int ac, char **av) assert(pselect(FD_SETSIZE + 1, set[0], set[1], NULL, &tm.ts, &mask) == 0); printf("pselect6(%d, [%d], [], NULL, {tv_sec=0, tv_nsec=123}, " "{[HUP CHLD], %u}) = 0 (Timeout)\n", - FD_SETSIZE + 1, fds[0], NSIG / 8); + FD_SETSIZE + 1, fds[0], NSIG_BYTES); /* * See how timeouts are decoded. @@ -137,7 +137,7 @@ int main(int ac, char **av) printf("pselect6(0, NULL, NULL, NULL, {tv_sec=0, tv_nsec=222222222}, " "{[HUP CHLD], %u}) = " "? ERESTARTNOHAND (To be restarted if no handler)\n", - NSIG / 8); + NSIG_BYTES); puts("--- SIGALRM {si_signo=SIGALRM, si_code=SI_KERNEL} ---"); puts("+++ exited with 0 +++");