aboutsummaryrefslogtreecommitdiff
path: root/gdb/btrace.c
diff options
context:
space:
mode:
authorMarkus Metzger <markus.t.metzger@intel.com>2015-12-23 13:53:53 +0100
committerMarkus Metzger <markus.t.metzger@intel.com>2016-01-04 09:43:39 +0100
commit43368e1d9ab8437079001f7a5f6ae2241acaece3 (patch)
tree990ffbd4be2a393cc3779d74b665a704598d4406 /gdb/btrace.c
parent77cf2ef5dc9099501529151921a73be904757466 (diff)
downloadgdb-43368e1d9ab8437079001f7a5f6ae2241acaece3.zip
gdb-43368e1d9ab8437079001f7a5f6ae2241acaece3.tar.gz
gdb-43368e1d9ab8437079001f7a5f6ae2241acaece3.tar.bz2
btrace: do not return out of TRY/CATCH
In btrace_pt_readmem_callback, we read memory inside TRY/CATCH and return in case of an error return value. This corrupts the cleanup chain, which eventually results in a SEGV when doing or discarding cleanups later on. gdb/ * btrace.c (btrace_pt_readmem_callback): Do not return in TRY/CATCH. testsuite/ * gdb.btrace/dlopen.exp: New. * gdb.btrace/dlopen.c: New. * gdb.btrace/dlopen-dso.c: New.
Diffstat (limited to 'gdb/btrace.c')
-rw-r--r--gdb/btrace.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/gdb/btrace.c b/gdb/btrace.c
index b7f8106..4c88ddd 100644
--- a/gdb/btrace.c
+++ b/gdb/btrace.c
@@ -842,21 +842,22 @@ btrace_pt_readmem_callback (gdb_byte *buffer, size_t size,
const struct pt_asid *asid, uint64_t pc,
void *context)
{
- int errcode;
+ int result, errcode;
+ result = (int) size;
TRY
{
errcode = target_read_code ((CORE_ADDR) pc, buffer, size);
if (errcode != 0)
- return -pte_nomap;
+ result = -pte_nomap;
}
CATCH (error, RETURN_MASK_ERROR)
{
- return -pte_nomap;
+ result = -pte_nomap;
}
END_CATCH
- return size;
+ return result;
}
/* Translate the vendor from one enum to another. */