]> granicus.if.org Git - strace/commitdiff
ipc.c: use printaddr and umove_or_printaddr
authorDmitry V. Levin <ldv@altlinux.org>
Mon, 20 Jul 2015 10:11:33 +0000 (10:11 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Mon, 20 Jul 2015 22:03:06 +0000 (22:03 +0000)
* ipc.c (sys_msgctl): Use printaddr.
(tprint_msgbuf): New function.
(tprint_msgsnd, tprint_msgrcv): Use it.
(sys_msgrcv): Use umove_or_printaddr.
(tprint_sembuf): Rename to tprint_sembuf_array.
(tprint_sembuf): New function.
(tprint_sembuf_array): Use it.
(sys_semop, sys_semtimedop): Update callers.
(sys_shmctl, sys_shmat, sys_shmdt): Use printaddr.
(sys_mq_open, printmqattr): Use printaddr and umove_or_printaddr.
* tests/ipc_msg.c (main): Update msgctl IPC_RMID regexp.
* tests/ipc_shm.c (main): Update shmctl IPC_RMID regexp.

ipc.c
tests/ipc_msg.c
tests/ipc_shm.c

diff --git a/ipc.c b/ipc.c
index dc72151b9085012a42fa538a0a6c946158b0fe61..33f487200e577c921421c3d0e473209ea5278a15 100644 (file)
--- a/ipc.c
+++ b/ipc.c
@@ -102,24 +102,29 @@ SYS_FUNC(msgctl)
 {
        tprintf("%lu, ", tcp->u_arg[0]);
        PRINTCTL(msgctl_flags, tcp->u_arg[1], "MSG_???");
-       tprintf(", %#lx", tcp->u_arg[indirect_ipccall(tcp) ? 3 : 2]);
+       tprints(", ");
+       printaddr(tcp->u_arg[indirect_ipccall(tcp) ? 3 : 2]);
        return RVAL_DECODED;
 }
 
 static void
-tprint_msgsnd(struct tcb *tcp, long addr, unsigned long count,
-             unsigned long flags)
+tprint_msgbuf(struct tcb *tcp, const long addr, const unsigned long count)
 {
        long mtype;
 
-       if (umove(tcp, addr, &mtype) < 0) {
-               tprintf("%#lx", addr);
-       } else {
+       if (!umove_or_printaddr(tcp, addr, &mtype)) {
                tprintf("{%lu, ", mtype);
                printstr(tcp, addr + sizeof(mtype), count);
                tprints("}");
        }
        tprintf(", %lu, ", count);
+}
+
+static void
+tprint_msgsnd(struct tcb *tcp, const long addr, const unsigned long count,
+             const unsigned long flags)
+{
+       tprint_msgbuf(tcp, addr, count);
        printflags(ipc_msg_flags, flags, "MSG_???");
 }
 
@@ -137,18 +142,11 @@ SYS_FUNC(msgsnd)
 }
 
 static void
-tprint_msgrcv(struct tcb *tcp, long addr, unsigned long count, long msgtyp)
+tprint_msgrcv(struct tcb *tcp, const long addr, const unsigned long count,
+             const long msgtyp)
 {
-       long mtype;
-
-       if (syserror(tcp) || umove(tcp, addr, &mtype) < 0) {
-               tprintf("%#lx", addr);
-       } else {
-               tprintf("{%lu, ", mtype);
-               printstr(tcp, addr + sizeof(mtype), count);
-               tprints("}");
-       }
-       tprintf(", %lu, %ld, ", count, msgtyp);
+       tprint_msgbuf(tcp, addr, count);
+       tprintf("%ld, ", msgtyp);
 }
 
 SYS_FUNC(msgrcv)
@@ -162,13 +160,11 @@ SYS_FUNC(msgrcv)
                                long msgtyp;
                        } tmp;
 
-                       if (umove(tcp, tcp->u_arg[3], &tmp) < 0) {
-                               tprintf("%#lx, %lu, ",
-                                       tcp->u_arg[3], tcp->u_arg[1]);
-                       } else {
+                       if (umove_or_printaddr(tcp, tcp->u_arg[3], &tmp))
+                               tprintf(", %lu, ", tcp->u_arg[1]);
+                       else
                                tprint_msgrcv(tcp, (long) tmp.msgp,
                                        tcp->u_arg[1], tmp.msgtyp);
-                       }
                        printflags(ipc_msg_flags, tcp->u_arg[2], "MSG_???");
                } else {
                        tprint_msgrcv(tcp, tcp->u_arg[1],
@@ -180,54 +176,55 @@ SYS_FUNC(msgrcv)
 }
 
 static void
-tprint_sembuf(struct tcb *tcp, long addr, unsigned long count)
+tprint_sembuf(const struct sembuf *sb)
+{
+       tprintf("{%u, %d, ", sb->sem_num, sb->sem_op);
+       printflags(semop_flags, sb->sem_flg, "SEM_???");
+       tprints("}");
+}
+
+static void
+tprint_sembuf_array(struct tcb *tcp, const long addr, const unsigned long count)
 {
-       unsigned long i, max_count;
+       unsigned long max_count;
+       struct sembuf sb;
 
        if (abbrev(tcp))
                max_count = (max_strlen < count) ? max_strlen : count;
        else
                max_count = count;
 
-       if (!max_count) {
-               tprintf("%#lx, %lu", addr, count);
-               return;
-       }
+       if (!max_count)
+               printaddr(addr);
+       else if (!umove_or_printaddr(tcp, addr, &sb)) {
+               unsigned long i;
+
+               tprints("[");
+               tprint_sembuf(&sb);
 
-       for (i = 0; i < max_count; ++i) {
-               struct sembuf sb;
-               if (i)
+               for (i = 1; i < max_count; ++i) {
                        tprints(", ");
-               if (umove(tcp, addr + i * sizeof(struct sembuf), &sb) < 0) {
-                       if (i) {
-                               tprints("{???}");
+                       if (umove_or_printaddr(tcp, addr + i * sizeof(sb), &sb))
                                break;
-                       } else {
-                               tprintf("%#lx, %lu", addr, count);
-                               return;
-                       }
-               } else {
-                       if (!i)
-                               tprints("{");
-                       tprintf("{%u, %d, ", sb.sem_num, sb.sem_op);
-                       printflags(semop_flags, sb.sem_flg, "SEM_???");
-                       tprints("}");
+                       else
+                               tprint_sembuf(&sb);
                }
-       }
 
-       if (i < max_count || max_count < count)
-               tprints(", ...");
+               if (i < max_count || max_count < count)
+                       tprints(", ...");
 
-       tprintf("}, %lu", count);
+               tprints("]");
+       }
+       tprintf(", %lu", count);
 }
 
 SYS_FUNC(semop)
 {
        tprintf("%lu, ", tcp->u_arg[0]);
        if (indirect_ipccall(tcp)) {
-               tprint_sembuf(tcp, tcp->u_arg[3], tcp->u_arg[1]);
+               tprint_sembuf_array(tcp, tcp->u_arg[3], tcp->u_arg[1]);
        } else {
-               tprint_sembuf(tcp, tcp->u_arg[1], tcp->u_arg[2]);
+               tprint_sembuf_array(tcp, tcp->u_arg[1], tcp->u_arg[2]);
        }
        return RVAL_DECODED;
 }
@@ -236,7 +233,7 @@ SYS_FUNC(semtimedop)
 {
        tprintf("%lu, ", tcp->u_arg[0]);
        if (indirect_ipccall(tcp)) {
-               tprint_sembuf(tcp, tcp->u_arg[3], tcp->u_arg[1]);
+               tprint_sembuf_array(tcp, tcp->u_arg[3], tcp->u_arg[1]);
                tprints(", ");
 #if defined(S390) || defined(S390X)
                printtv(tcp, tcp->u_arg[2]);
@@ -244,7 +241,7 @@ SYS_FUNC(semtimedop)
                printtv(tcp, tcp->u_arg[4]);
 #endif
        } else {
-               tprint_sembuf(tcp, tcp->u_arg[1], tcp->u_arg[2]);
+               tprint_sembuf_array(tcp, tcp->u_arg[1], tcp->u_arg[2]);
                tprints(", ");
                printtv(tcp, tcp->u_arg[3]);
        }
@@ -270,11 +267,10 @@ SYS_FUNC(semctl)
        PRINTCTL(semctl_flags, tcp->u_arg[2], "SEM_???");
        tprints(", ");
        if (indirect_ipccall(tcp)) {
-               if (current_wordsize == sizeof(int)) {
+               if (current_wordsize == sizeof(int))
                        printnum_int(tcp, tcp->u_arg[3], "%#x");
-               } else {
+               else
                        printnum_long(tcp, tcp->u_arg[3], "%#lx");
-               }
        } else {
                tprintf("%#lx", tcp->u_arg[3]);
        }
@@ -298,19 +294,22 @@ SYS_FUNC(shmctl)
 {
        tprintf("%lu, ", tcp->u_arg[0]);
        PRINTCTL(shmctl_flags, tcp->u_arg[1], "SHM_???");
-       tprintf(", %#lx", tcp->u_arg[indirect_ipccall(tcp) ? 3 : 2]);
+       tprints(", ");
+       printaddr(tcp->u_arg[indirect_ipccall(tcp) ? 3 : 2]);
        return RVAL_DECODED;
 }
 
 SYS_FUNC(shmat)
 {
        if (entering(tcp)) {
-               tprintf("%lu", tcp->u_arg[0]);
+               tprintf("%lu", tcp->u_arg[0]);
                if (indirect_ipccall(tcp)) {
-                       tprintf(", %#lx, ", tcp->u_arg[3]);
+                       printaddr(tcp->u_arg[3]);
+                       tprints(", ");
                        printflags(shm_flags, tcp->u_arg[1], "SHM_???");
                } else {
-                       tprintf(", %#lx, ", tcp->u_arg[1]);
+                       printaddr(tcp->u_arg[1]);
+                       tprints(", ");
                        printflags(shm_flags, tcp->u_arg[2], "SHM_???");
                }
                return 0;
@@ -329,7 +328,7 @@ SYS_FUNC(shmat)
 
 SYS_FUNC(shmdt)
 {
-       tprintf("%#lx", tcp->u_arg[indirect_ipccall(tcp) ? 3 : 0]);
+       printaddr(tcp->u_arg[indirect_ipccall(tcp) ? 3 : 0]);
        return RVAL_DECODED;
 }
 
@@ -340,15 +339,14 @@ SYS_FUNC(mq_open)
        /* flags */
        tprint_open_modes(tcp->u_arg[1]);
        if (tcp->u_arg[1] & O_CREAT) {
+               /* mode */
+               tprintf(", %#lo, ", tcp->u_arg[2]);
 # ifndef HAVE_MQUEUE_H
-               tprintf(", %lx", tcp->u_arg[2]);
+               printaddr(tcp, tcp->u_arg[3]);
 # else
                struct mq_attr attr;
-               /* mode */
-               tprintf(", %#lo, ", tcp->u_arg[2]);
-               if (umove(tcp, tcp->u_arg[3], &attr) < 0)
-                       tprints("{???}");
-               else
+
+               if (!umove_or_printaddr(tcp, tcp->u_arg[3], &attr))
                        tprintf("{mq_maxmsg=%ld, mq_msgsize=%ld}",
                                (long) attr.mq_maxmsg,
                                (long) attr.mq_msgsize);
@@ -386,26 +384,20 @@ SYS_FUNC(mq_notify)
 }
 
 static void
-printmqattr(struct tcb *tcp, long addr)
+printmqattr(struct tcb *tcp, const long addr)
 {
-       if (addr == 0)
-               tprints("NULL");
-       else {
 # ifndef HAVE_MQUEUE_H
-               tprintf("%#lx", addr);
+       printaddr(addr);
 # else
-               struct mq_attr attr;
-               if (umove(tcp, addr, &attr) < 0) {
-                       tprints("{...}");
-                       return;
-               }
-               tprints("{mq_flags=");
-               tprint_open_modes(attr.mq_flags);
-               tprintf(", mq_maxmsg=%ld, mq_msgsize=%ld, mq_curmsg=%ld}",
-                       (long) attr.mq_maxmsg, (long) attr.mq_msgsize,
-                       (long) attr.mq_curmsgs);
+       struct mq_attr attr;
+       if (umove_or_printaddr(tcp, addr, &attr))
+               return;
+       tprints("{mq_flags=");
+       tprint_open_modes(attr.mq_flags);
+       tprintf(", mq_maxmsg=%ld, mq_msgsize=%ld, mq_curmsg=%ld}",
+               (long) attr.mq_maxmsg, (long) attr.mq_msgsize,
+               (long) attr.mq_curmsgs);
 # endif
-       }
 }
 
 SYS_FUNC(mq_getsetattr)
index ed2bfd6cb86480b18532023bf1e27450ca08b1b0..12df622697191a3d4d06661541624265380e6632 100644 (file)
@@ -37,9 +37,9 @@ main(void)
 
        rc = 0;
 done:
-       if (msgctl(id, IPC_RMID, 0) < 0)
+       if (msgctl(id, IPC_RMID, NULL) < 0)
                return 1;
-       printf("msgctl\\(%d, (IPC_64\\|)?IPC_RMID, 0\\) += 0\n", id);
+       printf("msgctl\\(%d, (IPC_64\\|)?IPC_RMID, NULL\\) += 0\n", id);
        return rc;
 
 fail:
index 5888dc670ee27d8818003b82b9f03233e260a655..95a1d578f9c62bc3810aad825e257a49b74eaccf 100644 (file)
@@ -37,9 +37,9 @@ main(void)
 
        rc = 0;
 done:
-       if (shmctl(id, IPC_RMID, 0) < 0)
+       if (shmctl(id, IPC_RMID, NULL) < 0)
                return 1;
-       printf("shmctl\\(%d, (IPC_64\\|)?IPC_RMID, 0\\) += 0\n", id);
+       printf("shmctl\\(%d, (IPC_64\\|)?IPC_RMID, NULL\\) += 0\n", id);
        return rc;
 
 fail: