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 /bjm.c | |
parent | f0df31e71a58c6e79ba77c1a9d84b2f38d44bec7 (diff) | |
download | strace-62e0596dbda6831f7f7a976c183373d5ff7a7584.tar.gz |
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 'bjm.c')
-rw-r--r-- | bjm.c | 79 |
1 files changed, 43 insertions, 36 deletions
@@ -98,52 +98,54 @@ static const struct xlat modflags[] = { }; int -sys_query_module(tcp) -struct tcb *tcp; +sys_query_module(struct tcb *tcp) { - - if (exiting(tcp)) { + if (entering(tcp)) { printstr(tcp, tcp->u_arg[0], -1); tprintf(", "); printxval(which, tcp->u_arg[1], "QM_???"); tprintf(", "); - if (!verbose(tcp)) { - tprintf("%#lx, %lu, %#lx", tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[4]); - } else if (tcp->u_rval!=0) { - size_t ret; - umove(tcp, tcp->u_arg[4], &ret); - tprintf("%#lx, %lu, %Zu", tcp->u_arg[2], tcp->u_arg[3], ret); + } else { + size_t ret; + + if (!verbose(tcp) || syserror(tcp) || + umove(tcp, tcp->u_arg[4], &ret) < 0) { + tprintf("%#lx, %lu, %#lx", tcp->u_arg[2], + tcp->u_arg[3], tcp->u_arg[4]); } else if (tcp->u_arg[1]==QM_INFO) { struct module_info mi; - size_t ret; - umove(tcp, tcp->u_arg[2], &mi); - tprintf("{address=%#lx, size=%lu, flags=", mi.addr, mi.size); - printflags(modflags, mi.flags, "MOD_???"); - tprintf(", usecount=%lu}", mi.usecount); - umove(tcp, tcp->u_arg[4], &ret); - tprintf(", %Zu", ret); + if (umove(tcp, tcp->u_arg[2], &mi) < 0) { + tprintf("%#lx, ", tcp->u_arg[2]); + } else { + tprintf("{address=%#lx, size=%lu, flags=", + mi.addr, mi.size); + printflags(modflags, mi.flags, "MOD_???"); + tprintf(", usecount=%lu}, ", mi.usecount); + } + tprintf("%Zu", ret); } else if ((tcp->u_arg[1]==QM_MODULES) || (tcp->u_arg[1]==QM_DEPS) || (tcp->u_arg[1]==QM_REFS)) { - size_t ret; - - umove(tcp, tcp->u_arg[4], &ret); tprintf("{"); if (!abbrev(tcp)) { - char* data = (char*)malloc(tcp->u_arg[3]); + char* data = malloc(tcp->u_arg[3]); char* mod = data; size_t idx; - if (data==NULL) { + if (!data) { fprintf(stderr, "out of memory\n"); tprintf(" /* %Zu entries */ ", ret); } else { - umoven(tcp, tcp->u_arg[2], tcp->u_arg[3], data); - for (idx=0; idx<ret; idx++) { - if (idx!=0) - tprintf(","); - tprintf("%s", mod); - mod+=strlen(mod)+1; + if (umoven(tcp, tcp->u_arg[2], + tcp->u_arg[3], data) < 0) { + tprintf(" /* %Zu entries */ ", ret); + } else { + for (idx=0; idx<ret; idx++) { + tprintf("%s%s", + (idx ? ", " : ""), + mod); + mod += strlen(mod)+1; + } } free(data); } @@ -151,22 +153,27 @@ struct tcb *tcp; tprintf(" /* %Zu entries */ ", ret); tprintf("}, %Zu", ret); } else if (tcp->u_arg[1]==QM_SYMBOLS) { - size_t ret; - umove(tcp, tcp->u_arg[4], &ret); tprintf("{"); if (!abbrev(tcp)) { - char* data = (char *)malloc(tcp->u_arg[3]); + char* data = malloc(tcp->u_arg[3]); struct module_symbol* sym = (struct module_symbol*)data; size_t idx; - if (data==NULL) { + if (!data) { fprintf(stderr, "out of memory\n"); tprintf(" /* %Zu entries */ ", ret); } else { - umoven(tcp, tcp->u_arg[2], tcp->u_arg[3], data); - for (idx=0; idx<ret; idx++) { - tprintf("{name=%s, value=%lu} ", data+(long)sym->name, sym->value); - sym++; + if (umoven(tcp, tcp->u_arg[2], + tcp->u_arg[3], data) < 0) { + tprintf(" /* %Zu entries */ ", ret); + } else { + for (idx=0; idx<ret; idx++) { + tprintf("%s{name=%s, value=%lu}", + (idx ? " " : ""), + data+(long)sym->name, + sym->value); + sym++; + } } free(data); } |