summaryrefslogtreecommitdiff
path: root/ipc.c
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@altlinux.org>2009-11-03 14:38:44 +0000
committerDmitry V. Levin <ldv@altlinux.org>2009-11-06 17:27:46 +0000
commit62e0596dbda6831f7f7a976c183373d5ff7a7584 (patch)
tree6ee9808364ea50b6093fc1f925754b73aa04a627 /ipc.c
parentf0df31e71a58c6e79ba77c1a9d84b2f38d44bec7 (diff)
downloadstrace-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.c46
1 files changed, 26 insertions, 20 deletions
diff --git a/ipc.c b/ipc.c
index c0f4bb8..553aa81 100644
--- a/ipc.c
+++ b/ipc.c
@@ -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_???");
}
}