diff options
author | Andreas Arnez <arnez at linux dot vnet dot ibm dot com> | 2013-11-13 14:00:44 +0100 |
---|---|---|
committer | Ulrich Weigand <ulrich.weigand@de.ibm.com> | 2013-11-15 17:25:23 +0100 |
commit | 19a1b230f33dbcfa54cd1a9f88c2d5158f833f6f (patch) | |
tree | bfc1154d1345b7094bf073a2895d4941d2acdcfe /gdb | |
parent | e092da29031a5a5a74beb1d671da98d55fff6ebd (diff) | |
download | fsf-binutils-gdb-19a1b230f33dbcfa54cd1a9f88c2d5158f833f6f.zip fsf-binutils-gdb-19a1b230f33dbcfa54cd1a9f88c2d5158f833f6f.tar.gz fsf-binutils-gdb-19a1b230f33dbcfa54cd1a9f88c2d5158f833f6f.tar.bz2 |
Fix GDB crash with upstream GCC due to memcpy(NULL, ...)
Similar to qsort(), the glibc version of memcpy() also declares its
arguments with __attribute__(__nonnull__(...)). If NULL is passed
anyway, upstream GCC's new pass '-fisolate-erroneous-paths' typically
causes a trap in such cases. I've encountered this with GDB in
chain_candidate() when trying to execute the break.exp test case.
gdb/
2013-11-13 Andreas Arnez <arnez@linux.vnet.ibm.com>
* dwarf2loc.c (chain_candidate): Prevent invoking memcpy with
NULL.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/dwarf2loc.c | 5 |
2 files changed, 8 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 630f86b..fec7528 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2013-11-15 Andreas Arnez <arnez@linux.vnet.ibm.com> + + * dwarf2loc.c (chain_candidate): Prevent invoking memcpy with + NULL. + 2013-11-15 Tom Tromey <tromey@redhat.com> PR c++/16117: diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index 8b6eb66..2879ead 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -761,8 +761,9 @@ chain_candidate (struct gdbarch *gdbarch, struct call_site_chain **resultp, * (length - 1)); result->length = length; result->callers = result->callees = length; - memcpy (result->call_site, VEC_address (call_sitep, chain), - sizeof (*result->call_site) * length); + if (!VEC_empty (call_sitep, chain)) + memcpy (result->call_site, VEC_address (call_sitep, chain), + sizeof (*result->call_site) * length); *resultp = result; if (entry_values_debug) |