summaryrefslogtreecommitdiff
path: root/bjm.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 /bjm.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 'bjm.c')
-rw-r--r--bjm.c79
1 files changed, 43 insertions, 36 deletions
diff --git a/bjm.c b/bjm.c
index c8c2395..6c948d5 100644
--- a/bjm.c
+++ b/bjm.c
@@ -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);
}