gdb/linux-record: Fix old_select syscall handling
authorMarcin Kościelnicki <koriakin@0x04.net>
Fri, 30 Oct 2015 15:52:01 +0000 (15:52 +0000)
committerPedro Alves <palves@redhat.com>
Fri, 30 Oct 2015 15:52:01 +0000 (15:52 +0000)
We have to use extract_unsigned_integer to read paramaters structure - target
pointers can have different endianness and size.

gdb/ChangeLog:

* linux-record.c (record_linux_system_call): Fix old_select.

gdb/ChangeLog
gdb/linux-record.c

index 433ec95c0c363d804946897c8be0046d623fb74f..509fd7e1f2ce905db8ab6e509fc61cbebcf6e7c6 100644 (file)
@@ -1,3 +1,7 @@
+2015-10-30  Marcin Kościelnicki  <koriakin@0x04.net>
+
+       * linux-record.c (record_linux_system_call): Fix old_select.
+
 2015-10-30  Marcin Kościelnicki  <koriakin@0x04.net>
 
        * linux-record.c (record_linux_system_call): Fix newstatat.
index 9f38c0b6bd7c8736bbcc601d9043eae8dafb40f1..091ac8a14ed88217d5e1d0ce12c1739af5be4887 100644 (file)
@@ -645,38 +645,45 @@ record_linux_system_call (enum gdb_syscall syscall,
 
     case gdb_old_select:
       {
-        struct sel_arg_struct
-        {
-          CORE_ADDR n;
-          CORE_ADDR inp;
-          CORE_ADDR outp;
-          CORE_ADDR exp;
-          CORE_ADDR tvp;
-        } sel;
+        unsigned long sz_sel_arg = tdep->size_long + tdep->size_pointer * 4;
+        gdb_byte *a = (gdb_byte *) alloca (sz_sel_arg);
+        CORE_ADDR inp, outp, exp, tvp;
 
         regcache_raw_read_unsigned (regcache, tdep->arg1,
                                     &tmpulongest);
         if (tmpulongest)
           {
-            if (target_read_memory (tmpulongest, (gdb_byte *) &sel,
-                                    sizeof(sel)))
+            if (target_read_memory (tmpulongest, a, sz_sel_arg))
               {
                 if (record_debug)
                   fprintf_unfiltered (gdb_stdlog,
                                       "Process record: error reading memory "
                                       "at addr = 0x%s len = %lu.\n",
                                       OUTPUT_REG (tmpulongest, tdep->arg1),
-                                      (unsigned long) sizeof (sel));
+                                      sz_sel_arg);
                 return -1;
               }
-            if (record_full_arch_list_add_mem (sel.inp, tdep->size_fd_set))
-              return -1;
-            if (record_full_arch_list_add_mem (sel.outp, tdep->size_fd_set))
-              return -1;
-            if (record_full_arch_list_add_mem (sel.exp, tdep->size_fd_set))
-              return -1;
-            if (record_full_arch_list_add_mem (sel.tvp, tdep->size_timeval))
-              return -1;
+            /* Skip n. */
+            a += tdep->size_long;
+            inp = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
+            a += tdep->size_pointer;
+            outp = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
+            a += tdep->size_pointer;
+            exp = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
+            a += tdep->size_pointer;
+            tvp = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
+            if (inp)
+              if (record_full_arch_list_add_mem (inp, tdep->size_fd_set))
+                return -1;
+            if (outp)
+              if (record_full_arch_list_add_mem (outp, tdep->size_fd_set))
+                return -1;
+            if (exp)
+              if (record_full_arch_list_add_mem (exp, tdep->size_fd_set))
+                return -1;
+            if (tvp)
+              if (record_full_arch_list_add_mem (tvp, tdep->size_timeval))
+                return -1;
           }
       }
       break;