]> granicus.if.org Git - strace/commitdiff
decode_socket_subcall: fetch all arguments with a single umoven call
authorDmitry V. Levin <ldv@altlinux.org>
Sun, 22 Mar 2015 15:52:40 +0000 (15:52 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Sun, 22 Mar 2015 15:52:40 +0000 (15:52 +0000)
* syscall.c (decode_socket_subcall): Replace umoven fetch loop
with a single umoven call.

syscall.c

index e981a68cf43f6a5adcd81482637b8a6e4dfb3f98..67af9fd811e0d5207f1aa501fa966cffef8d0fc4 100644 (file)
--- a/syscall.c
+++ b/syscall.c
@@ -559,7 +559,7 @@ static void
 decode_socket_subcall(struct tcb *tcp)
 {
        unsigned long addr;
-       unsigned int i, n, size;
+       unsigned int n;
 
        if (tcp->u_arg[0] < 0 || tcp->u_arg[0] >= SYS_socket_nsubcalls)
                return;
@@ -568,22 +568,18 @@ decode_socket_subcall(struct tcb *tcp)
        tcp->qual_flg = qual_flags[tcp->scno];
        tcp->s_ent = &sysent[tcp->scno];
        addr = tcp->u_arg[1];
-       size = current_wordsize;
        n = tcp->s_ent->nargs;
-       for (i = 0; i < n; ++i) {
-               if (size == sizeof(int)) {
-                       unsigned int arg;
-                       if (umove(tcp, addr, &arg) < 0)
-                               arg = 0;
-                       tcp->u_arg[i] = arg;
-               }
-               else {
-                       unsigned long arg;
-                       if (umove(tcp, addr, &arg) < 0)
-                               arg = 0;
-                       tcp->u_arg[i] = arg;
-               }
-               addr += size;
+       if (sizeof(tcp->u_arg[0]) == current_wordsize) {
+               memset(tcp->u_arg, 0, n * sizeof(tcp->u_arg[0]));
+               (void) umoven(tcp, addr, n * sizeof(tcp->u_arg[0]), tcp->u_arg);
+       } else {
+               unsigned int args[n];
+               unsigned int i;
+
+               memset(args, 0, sizeof(args));
+               (void) umove(tcp, addr, &args);
+               for (i = 0; i < n; ++i)
+                       tcp->u_arg[i] = args[i];
        }
 }
 #endif