]> granicus.if.org Git - strace/commitdiff
Add compat support for sys_pselect6
authorDenys Vlasenko <dvlasenk@redhat.com>
Thu, 18 Jul 2013 16:10:13 +0000 (18:10 +0200)
committerDenys Vlasenko <dvlasenk@redhat.com>
Thu, 18 Jul 2013 16:10:13 +0000 (18:10 +0200)
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
desc.c

diff --git a/desc.c b/desc.c
index ac07ca7234f7f7b809c8fbd521890264bbdf2672..9bfe4d00b918570c110f55603e75814f079697b8 100644 (file)
--- a/desc.c
+++ b/desc.c
@@ -1048,16 +1048,29 @@ sys_pselect6(struct tcb *tcp)
 {
        int rc = decode_select(tcp, tcp->u_arg, BITNESS_CURRENT);
        if (entering(tcp)) {
+               long r;
                struct {
-                       void *ss;
+                       unsigned long ptr;
                        unsigned long len;
                } data;
-               if (umove(tcp, tcp->u_arg[5], &data) < 0)
+#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
+               if (current_wordsize == 4) {
+                       struct {
+                               uint32_t ptr;
+                               uint32_t len;
+                       } data32;
+                       r = umove(tcp, tcp->u_arg[5], &data32);
+                       data.ptr = data32.ptr;
+                       data.len = data32.len;
+               } else
+#endif
+                       r = umove(tcp, tcp->u_arg[5], &data);
+               if (r < 0)
                        tprintf(", %#lx", tcp->u_arg[5]);
                else {
                        tprints(", {");
                        /* NB: kernel requires data.len == NSIG / 8 */
-                       print_sigset_addr_len(tcp, (long)data.ss, data.len);
+                       print_sigset_addr_len(tcp, data.ptr, data.len);
                        tprintf(", %lu}", data.len);
                }
        }