diff options
author | Dmitry V. Levin <ldv@altlinux.org> | 2009-11-03 14:38:44 +0000 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2009-11-06 17:27:46 +0000 |
commit | 62e0596dbda6831f7f7a976c183373d5ff7a7584 (patch) | |
tree | 6ee9808364ea50b6093fc1f925754b73aa04a627 /ipc.c | |
parent | f0df31e71a58c6e79ba77c1a9d84b2f38d44bec7 (diff) | |
download | strace-62e0596dbda6831f7f7a976c183373d5ff7a7584.tar.gz strace-62e0596dbda6831f7f7a976c183373d5ff7a7584.tar.bz2 strace-62e0596dbda6831f7f7a976c183373d5ff7a7584.tar.xz |
Check umove() return code
* bjm.c (sys_query_module): Print input parameters when entering
syscall. Fix handling of syscall error. Handle unlikely umove()
failures.
* ipc.c (tprint_msgrcv): New function. Move part of msgrcv parser code
here, add check umove() return code.
(sys_msgsnd): Print msqid parameter as int instead of long.
(sys_msgrcv): Likewise. Use tprint_msgrcv().
* process.c (print_affinitylist): Check umove() return code.
* sock.c (sock_ioctl): Handle unlikely umove() failure in the
SIOCGIFCONF parser.
Diffstat (limited to 'ipc.c')
-rw-r--r-- | ipc.c | 46 |
1 files changed, 26 insertions, 20 deletions
@@ -230,7 +230,7 @@ tprint_msgsnd(struct tcb *tcp, long addr, unsigned long count) int sys_msgsnd(struct tcb *tcp) { if (entering(tcp)) { - tprintf("%lu, ", tcp->u_arg[0]); + tprintf("%d, ", (int) tcp->u_arg[0]); if (indirect_ipccall(tcp)) { tprint_msgsnd(tcp, tcp->u_arg[3], tcp->u_arg[1]); } else { @@ -240,37 +240,43 @@ int sys_msgsnd(struct tcb *tcp) return 0; } -int sys_msgrcv(tcp) -struct tcb *tcp; +static void +tprint_msgrcv(struct tcb *tcp, long addr, unsigned long count, 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); + tprintf("}"); + } + tprintf(", %lu, %ld, ", count, msgtyp); +} + +int sys_msgrcv(struct tcb *tcp) +{ if (entering(tcp)) { - tprintf("%lu, ", tcp->u_arg[0]); + tprintf("%d, ", (int) tcp->u_arg[0]); } else { - tprintf("%lu", tcp->u_arg[0]); if (indirect_ipccall(tcp)) { struct ipc_wrapper { struct msgbuf *msgp; long msgtyp; } tmp; - umove(tcp, tcp->u_arg[3], &tmp); - umove(tcp, (long) tmp.msgp, &mtype); - tprintf(", {%lu, ", mtype); - printstr(tcp, (long) (tmp.msgp) + sizeof(long), - tcp->u_arg[1]); - tprintf("}, %lu", tcp->u_arg[1]); - tprintf(", %ld", tmp.msgtyp); - tprintf(", "); + + if (umove(tcp, tcp->u_arg[3], &tmp) < 0) { + tprintf("%#lx, %lu, ", + tcp->u_arg[3], tcp->u_arg[1]); + } else { + tprint_msgrcv(tcp, (long) tmp.msgp, + tcp->u_arg[1], tmp.msgtyp); + } printflags(msg_flags, tcp->u_arg[2], "MSG_???"); } else { - umove(tcp, tcp->u_arg[1], &mtype); - tprintf("{%lu, ", mtype); - printstr(tcp, tcp->u_arg[1] + sizeof(long), - tcp->u_arg[2]); - tprintf("}, %lu", tcp->u_arg[2]); - tprintf(", %ld", tcp->u_arg[3]); - tprintf(", "); + tprint_msgrcv(tcp, tcp->u_arg[1], + tcp->u_arg[2], tcp->u_arg[3]); printflags(msg_flags, tcp->u_arg[4], "MSG_???"); } } |