aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorAndreas Arnez <arnez at linux dot vnet dot ibm dot com>2013-11-13 14:00:44 +0100
committerUlrich Weigand <ulrich.weigand@de.ibm.com>2013-11-15 17:25:23 +0100
commit19a1b230f33dbcfa54cd1a9f88c2d5158f833f6f (patch)
treebfc1154d1345b7094bf073a2895d4941d2acdcfe /gdb
parente092da29031a5a5a74beb1d671da98d55fff6ebd (diff)
downloadfsf-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/ChangeLog5
-rw-r--r--gdb/dwarf2loc.c5
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)