]> granicus.if.org Git - strace/blobdiff - desc.c
io: handle data_size of -1 as unlimited data in print_iovec
[strace] / desc.c
diff --git a/desc.c b/desc.c
index 662af305904689bb236aaa573e28b563c5af0f7a..4695db5830d7dee5fd4a984da8f940f6e23b4024 100644 (file)
--- a/desc.c
+++ b/desc.c
@@ -68,13 +68,6 @@ SYS_FUNC(dup3)
        return do_dup2(tcp, 2);
 }
 
-#if defined(ALPHA)
-SYS_FUNC(getdtablesize)
-{
-       return 0;
-}
-#endif
-
 static int
 decode_select(struct tcb *tcp, long *args,
              void (*print_tv_ts) (struct tcb *, const long),
@@ -233,20 +226,46 @@ SYS_FUNC(select)
        return decode_select(tcp, tcp->u_arg, print_timeval, sprint_timeval);
 }
 
+#include "kernel_types.h"
+
+static int
+umove_kulong_array_or_printaddr(struct tcb *tcp, const long addr,
+                               kernel_ulong_t *ptr, size_t n)
+{
+#if defined X86_64 || defined X32
+       if (current_personality == 1) {
+#else
+       if (current_wordsize < sizeof(*ptr)) {
+#endif
+               uint32_t ptr32[n];
+               int r = umove_or_printaddr(tcp, addr, &ptr32);
+               if (!r) {
+                       size_t i;
+
+                       for (i = 0; i < n; ++i)
+                               ptr[i] = (kernel_ulong_t) ptr32[i];
+               }
+               return r;
+       }
+       return umoven_or_printaddr(tcp, addr, n * sizeof(*ptr), ptr);
+}
+
 SYS_FUNC(pselect6)
 {
        int rc = decode_select(tcp, tcp->u_arg, print_timespec, sprint_timespec);
        if (entering(tcp)) {
-               unsigned long data[2];
+               kernel_ulong_t data[2];
 
                tprints(", ");
-               if (!umove_ulong_array_or_printaddr(tcp, tcp->u_arg[5], data,
-                                                   ARRAY_SIZE(data))) {
+               if (!umove_kulong_array_or_printaddr(tcp, tcp->u_arg[5],
+                                                    data, ARRAY_SIZE(data))) {
                        tprints("{");
                        /* NB: kernel requires data[1] == NSIG / 8 */
-                       print_sigset_addr_len(tcp, data[0], data[1]);
-                       tprintf(", %lu}", data[1]);
+                       print_sigset_addr_len(tcp, (unsigned long) data[0],
+                                             (unsigned long) data[1]);
+                       tprintf(", %llu}", (unsigned long long) data[1]);
                }
        }
+
        return rc;
 }