diff options
author | Jan Kratochvil <jan.kratochvil@redhat.com> | 2009-09-29 16:27:05 +0000 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2009-09-29 16:27:05 +0000 |
commit | e453266f586ea8d1417a6b710ff61147328cf7f5 (patch) | |
tree | 7aea4675a2f6809ead7ba581bc2fac1959d21c18 /gdb/ia64-tdep.c | |
parent | 94454bb4c9cfcf78717194a4a6376915a606343f (diff) | |
download | gdb-e453266f586ea8d1417a6b710ff61147328cf7f5.zip gdb-e453266f586ea8d1417a6b710ff61147328cf7f5.tar.gz gdb-e453266f586ea8d1417a6b710ff61147328cf7f5.tar.bz2 |
gdb/
* ia64-tdep.c (ia64_convert_from_func_ptr_addr): New variable buf.
Check first the descriptor memory is readable.
Diffstat (limited to 'gdb/ia64-tdep.c')
-rw-r--r-- | gdb/ia64-tdep.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c index 058930b..e9464e1 100644 --- a/gdb/ia64-tdep.c +++ b/gdb/ia64-tdep.c @@ -3510,6 +3510,7 @@ ia64_convert_from_func_ptr_addr (struct gdbarch *gdbarch, CORE_ADDR addr, { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); struct obj_section *s; + gdb_byte buf[8]; s = find_pc_section (addr); @@ -3520,10 +3521,12 @@ ia64_convert_from_func_ptr_addr (struct gdbarch *gdbarch, CORE_ADDR addr, /* Normally, functions live inside a section that is executable. So, if ADDR points to a non-executable section, then treat it as a function descriptor and return the target address iff - the target address itself points to a section that is executable. */ - if (s && (s->the_bfd_section->flags & SEC_CODE) == 0) + the target address itself points to a section that is executable. + Check first the memory of the whole length of 8 bytes is readable. */ + if (s && (s->the_bfd_section->flags & SEC_CODE) == 0 + && target_read_memory (addr, buf, 8) == 0) { - CORE_ADDR pc = read_memory_unsigned_integer (addr, 8, byte_order); + CORE_ADDR pc = extract_unsigned_integer (buf, 8, byte_order); struct obj_section *pc_section = find_pc_section (pc); if (pc_section && (pc_section->the_bfd_section->flags & SEC_CODE)) |