]> granicus.if.org Git - strace/blobdiff - ipc_shm.c
Introduce generic STRINGIFY and STRINGIFY_VAL macros
[strace] / ipc_shm.c
index b2059c2b3a4fcf11007fb26da78eee7e8d20d4e2..7284b183e2162d9dc725e3d29c9b7f919d563f6f 100644 (file)
--- a/ipc_shm.c
+++ b/ipc_shm.c
@@ -5,6 +5,7 @@
  * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
  * Copyright (c) 2003-2006 Roland McGrath <roland@redhat.com>
  * Copyright (c) 2006-2015 Dmitry V. Levin <ldv@altlinux.org>
+ * Copyright (c) 2015-2017 The strace developers.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 
 SYS_FUNC(shmget)
 {
-       if (tcp->u_arg[0])
-               tprintf("%#lx", tcp->u_arg[0]);
+       const int key = (int) tcp->u_arg[0];
+       if (key)
+               tprintf("%#x", key);
        else
                tprints("IPC_PRIVATE");
-       tprintf(", %lu, ", tcp->u_arg[1]);
+       tprintf(", %" PRI_klu ", ", tcp->u_arg[1]);
        if (printflags(shm_resource_flags, tcp->u_arg[2] & ~0777, NULL) != 0)
                tprints("|");
        print_numeric_umode_t(tcp->u_arg[2] & 0777);
@@ -57,7 +59,7 @@ SYS_FUNC(shmget)
 SYS_FUNC(shmat)
 {
        if (entering(tcp)) {
-               tprintf("%lu, ", tcp->u_arg[0]);
+               tprintf("%d, ", (int) tcp->u_arg[0]);
                if (indirect_ipccall(tcp)) {
                        printaddr(tcp->u_arg[3]);
                        tprints(", ");
@@ -72,10 +74,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;
        }