]> granicus.if.org Git - strace/commitdiff
Fix decoding of indirect shmat's return code for non-native personalities
authorDmitry V. Levin <ldv@altlinux.org>
Fri, 19 Aug 2016 22:57:27 +0000 (22:57 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Fri, 19 Aug 2016 22:57:27 +0000 (22:57 +0000)
* ipc_shm.c (SYS_FUNC(shmat)): Fetch current_wordsize bytes of data
to obtain return code of indirect shmat subcall.

ipc_shm.c

index b2059c2b3a4fcf11007fb26da78eee7e8d20d4e2..e8a8206b9be047b666a78d6bf510af347cb6e759 100644 (file)
--- a/ipc_shm.c
+++ b/ipc_shm.c
@@ -72,10 +72,14 @@ SYS_FUNC(shmat)
                if (syserror(tcp))
                        return 0;
                if (indirect_ipccall(tcp)) {
-                       unsigned long raddr;
-                       if (umove(tcp, tcp->u_arg[2], &raddr) < 0)
+                       union {
+                               uint64_t r64;
+                               uint32_t r32;
+                       } u;
+                       if (umoven(tcp, tcp->u_arg[2], current_wordsize, &u) < 0)
                                return RVAL_NONE;
-                       tcp->u_rval = raddr;
+                       tcp->u_rval = (sizeof(u.r32) == current_wordsize)
+                                     ? u.r32 : u.r64;
                }
                return RVAL_HEX;
        }