]> granicus.if.org Git - strace/commitdiff
Introduce NSIG_BYTES
authorDmitry V. Levin <ldv@altlinux.org>
Tue, 27 Dec 2016 23:32:44 +0000 (23:32 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Tue, 27 Dec 2016 23:32:44 +0000 (23:32 +0000)
* 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.

19 files changed:
desc.c
epoll.c
linux/alpha/arch_sigreturn.c
linux/arm/arch_sigreturn.c
linux/crisv10/arch_sigreturn.c
linux/ia64/arch_sigreturn.c
linux/m68k/arch_sigreturn.c
linux/microblaze/arch_sigreturn.c
linux/mips/arch_sigreturn.c
linux/powerpc/arch_sigreturn.c
linux/s390/arch_sigreturn.c
linux/sparc/arch_sigreturn.c
linux/tile/arch_sigreturn.c
linux/x86_64/arch_sigreturn.c
nsig.h
poll.c
signal.c
signalfd.c
tests/pselect6.c

diff --git a/desc.c b/desc.c
index 24d657fa3a4159d03c9e9a6de6bb5dc59bb68047..48824697fc090f48a4bab68177fa661c5440e86f 100644 (file)
--- 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 ee5499145258d016f8eb4f50cd233e9639fb000c..8dc7ab09569089c9b93a36541e05a139c5108db1 100644 (file)
--- 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]);
        }
index 320f91f99926b1010907e8a815fc516afa7cc688..3317a954489ee3a73eba189f499c1299e15261ae 100644 (file)
@@ -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("}");
 }
index 9a8584ebdc1b34f2710ac3069b6afaeb3eaa93de..378ba67f929d97aae9de98d1cb9b82191b8bbd58 100644 (file)
@@ -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("}");
 }
index d45e3bacf5e32c4234ff3307042183d23e43448b..b449d41eca73737aeefa6d89d97cd442cd534e93 100644 (file)
@@ -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("}");
 }
index 352ca6829b8716f440f4caf87d8438193861a9ff..0c0034f9c07b271d3a8334978277052c2f2813ee 100644 (file)
@@ -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("}");
 }
index ff3234583470f8096accd838d3650677c7f0b787..b1402683987257d4ef9d432c3dc9d18ba9c5e18e 100644 (file)
@@ -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;
index c8948153b61fa51788eba6514b4a3c0c15e78cc7..6eb7cd8e881f7c41bac4c718209d28e16d56e2fa 100644 (file)
@@ -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("}");
 }
index 142030937203cb0ba81f79e112b024fa1d570fb2..72f7619b4c569c826a0ede36d741a80fbcb27546 100644 (file)
@@ -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("}");
 }
index 644e05027756ac8934cf6d1051bc2820499a13a3..4f68648d66ad1580af2e8ff210fa76dcf50ca13b 100644 (file)
@@ -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
index 3990ae6f79f4e03930e207ff52f35263f3bff0a7..d1b8598652a06984782b362148fe93ab9576c103 100644 (file)
@@ -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) {
index dca441430ffe64534608f49c9eec1e1be5b51dec..2170a7baf6afd006270be2b5da94b53e55165b2b 100644 (file)
@@ -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));
index 53a3fbbe812a48c3a7a01804f96d5c43c8be2b5b..88e946f01735bf63fef5d8a1d8d98ff906d2c338 100644 (file)
@@ -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("}");
 }
index 6a161e6ef524227d9ee1613e75a3f3de5229fae5..060b93a736ad316d369af0aa74bce1c6a0330978 100644 (file)
@@ -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 4b0004248f34772be928623b87b851ae4e5d7dfc..528f7033bf89a0feccb499558204681cb421baae 100644 (file)
--- 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 b2d2771c065aa8ca13cdbacf9c8f81143ec451e9..f2a2381489eb1667c2b0d8f68b5124b294321133 100644 (file)
--- 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]);
 
index 4e18c6a071addd742c7b712102728f6752f9d966..2a425b13887a9803ff68ab65350650cd40eee1ee 100644 (file)
--- a/signal.c
+++ b/signal.c
  *     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(", ");
index f4631ad961aacae029b5d4f9c73db2f4dc924373..3895c76632327d1f779f0e8e94a34453532abc98 100644 (file)
@@ -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]);
index f8f10f5492fe2a539fe8869015500b2db7c649d3..f26448531a9c96dba6ab9f9ab10d83333308f990 100644 (file)
@@ -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 +++");