aboutsummaryrefslogtreecommitdiff
path: root/libbacktrace
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2019-02-12 14:00:59 +0000
committerTom de Vries <vries@gcc.gnu.org>2019-02-12 14:00:59 +0000
commit68641fb77c302c75ecc4ab478dc36af00b60215c (patch)
tree2dd62060cb986bf7c3b7551130513771d88b2a12 /libbacktrace
parentb3f2b048eb9833a7d0b72cd1ef68166dcf6bf566 (diff)
downloadgcc-68641fb77c302c75ecc4ab478dc36af00b60215c.zip
gcc-68641fb77c302c75ecc4ab478dc36af00b60215c.tar.gz
gcc-68641fb77c302c75ecc4ab478dc36af00b60215c.tar.bz2
[libbacktrace] Handle bsearch with NULL base in dwarf_lookup_pc
The call to bsearch in dwarf_lookup_pc can have NULL as base argument when the nmemb argument is 0. The base argument is required to be pointing to the initial member of an array of nmemb objects. It is not specified what constitutes a valid pointer to an array of 0 objects, but glibc declares base with attribute non-null, so the NULL will trigger a sanitizer runtime error. Fix this by only calling bsearch if nmemb != 0. 2019-02-12 Tom de Vries <tdevries@suse.de> PR libbacktrace/81983 * dwarf.c (dwarf_lookup_pc): Don't call bsearch if nmemb == 0. From-SVN: r268796
Diffstat (limited to 'libbacktrace')
-rw-r--r--libbacktrace/ChangeLog5
-rw-r--r--libbacktrace/dwarf.c6
2 files changed, 9 insertions, 2 deletions
diff --git a/libbacktrace/ChangeLog b/libbacktrace/ChangeLog
index 9e0da63..e29c41f 100644
--- a/libbacktrace/ChangeLog
+++ b/libbacktrace/ChangeLog
@@ -1,3 +1,8 @@
+2019-02-12 Tom de Vries <tdevries@suse.de>
+
+ PR libbacktrace/81983
+ * dwarf.c (dwarf_lookup_pc): Don't call bsearch if nmemb == 0.
+
2019-02-10 Tom de Vries <tdevries@suse.de>
* Makefile.am (BUILDTESTS): Add btest_lto.
diff --git a/libbacktrace/dwarf.c b/libbacktrace/dwarf.c
index d7dacf3..f338489 100644
--- a/libbacktrace/dwarf.c
+++ b/libbacktrace/dwarf.c
@@ -2821,8 +2821,10 @@ dwarf_lookup_pc (struct backtrace_state *state, struct dwarf_data *ddata,
*found = 1;
/* Find an address range that includes PC. */
- entry = bsearch (&pc, ddata->addrs, ddata->addrs_count,
- sizeof (struct unit_addrs), unit_addrs_search);
+ entry = (ddata->addrs_count == 0
+ ? NULL
+ : bsearch (&pc, ddata->addrs, ddata->addrs_count,
+ sizeof (struct unit_addrs), unit_addrs_search));
if (entry == NULL)
{