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.
This commit is contained in:
Markus Metzger
2015-12-23 13:53:53 +01:00
parent 77cf2ef5dc
commit 43368e1d9a
6 changed files with 139 additions and 4 deletions

View File

@ -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. */