From: Dmitry V. Levin Date: Mon, 20 Jul 2015 10:11:33 +0000 (+0000) Subject: ipc.c: use printaddr and umove_or_printaddr X-Git-Tag: v4.11~383 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2370d53281e00bc99558b2bd8f0794b2e989caa4;p=strace ipc.c: use printaddr and umove_or_printaddr * 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. --- diff --git a/ipc.c b/ipc.c index dc72151b..33f48720 100644 --- 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) diff --git a/tests/ipc_msg.c b/tests/ipc_msg.c index ed2bfd6c..12df6226 100644 --- a/tests/ipc_msg.c +++ b/tests/ipc_msg.c @@ -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: diff --git a/tests/ipc_shm.c b/tests/ipc_shm.c index 5888dc67..95a1d578 100644 --- a/tests/ipc_shm.c +++ b/tests/ipc_shm.c @@ -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: