diff options
author | Marcin KoĆcielnicki <koriakin@0x04.net> | 2015-10-30 15:52:01 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2015-10-30 15:52:01 +0000 |
commit | ff83a547feacaea9263c04f527aba4faae77035f (patch) | |
tree | 174e399d5996cc6c4db8009dae9eef48412690eb /gdb/linux-record.c | |
parent | d2de23ad3916c9d6f6102688fdbd5fdc73053c43 (diff) | |
download | fsf-binutils-gdb-ff83a547feacaea9263c04f527aba4faae77035f.zip fsf-binutils-gdb-ff83a547feacaea9263c04f527aba4faae77035f.tar.gz fsf-binutils-gdb-ff83a547feacaea9263c04f527aba4faae77035f.tar.bz2 |
gdb/linux-record: Fix old_select syscall handling
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.
Diffstat (limited to 'gdb/linux-record.c')
-rw-r--r-- | gdb/linux-record.c | 45 |
1 files changed, 26 insertions, 19 deletions
diff --git a/gdb/linux-record.c b/gdb/linux-record.c index 9f38c0b..091ac8a 100644 --- a/gdb/linux-record.c +++ b/gdb/linux-record.c @@ -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; |