[binutils-gdb] PR26459 UBSAN: elfnn-ia64.c:1945 null pointer bsearch
Alan Modra
amodra@sourceware.org
Sat Aug 29 04:25:02 GMT 2020
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=736c9875c040e88c5f508338b68f04f7a42c3b9d
commit 736c9875c040e88c5f508338b68f04f7a42c3b9d
Author: Alan Modra <amodra@gmail.com>
Date: Sat Aug 29 10:30:07 2020 +0930
PR26459 UBSAN: elfnn-ia64.c:1945 null pointer bsearch
PR 26495
* elfnn-ia64.c (get_dyn_sym_info): Don't bsearch or look at last
element when count is zero. bfd_realloc when shrinking.
Diff:
---
bfd/ChangeLog | 6 ++++++
bfd/elfnn-ia64.c | 40 +++++++++++++++++++++-------------------
2 files changed, 27 insertions(+), 19 deletions(-)
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 33cc1c474e1..cc8451ffe68 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2020-08-29 Alan Modra <amodra@gmail.com>
+
+ PR 26495
+ * elfnn-ia64.c (get_dyn_sym_info): Don't bsearch or look at last
+ element when count is zero. bfd_realloc when shrinking.
+
2020-08-28 Alan Modra <amodra@gmail.com>
PR 26418
diff --git a/bfd/elfnn-ia64.c b/bfd/elfnn-ia64.c
index cadf645df9e..292c00b6d03 100644
--- a/bfd/elfnn-ia64.c
+++ b/bfd/elfnn-ia64.c
@@ -1867,18 +1867,16 @@ get_dyn_sym_info (struct elfNN_ia64_link_hash_table *ia64_info,
key.addend = addend;
dyn_i = bsearch (&key, info, sorted_count,
sizeof (*info), addend_compare);
-
if (dyn_i)
- {
- return dyn_i;
- }
+ return dyn_i;
}
- /* Do a quick check for the last inserted entry. */
- dyn_i = info + count - 1;
- if (dyn_i->addend == addend)
+ if (count != 0)
{
- return dyn_i;
+ /* Do a quick check for the last inserted entry. */
+ dyn_i = info + count - 1;
+ if (dyn_i->addend == addend)
+ return dyn_i;
}
}
@@ -1932,19 +1930,23 @@ get_dyn_sym_info (struct elfNN_ia64_link_hash_table *ia64_info,
if (size != count)
{
amt = count * sizeof (*info);
- info = bfd_malloc (amt);
- if (info != NULL)
- {
- memcpy (info, *info_p, amt);
- free (*info_p);
- *size_p = count;
- *info_p = info;
- }
+ info = bfd_realloc (info, amt);
+ *size_p = count;
+ if (info == NULL && count != 0)
+ /* realloc should never fail since we are reducing size here,
+ but if it does use the old array. */
+ info = *info_p;
+ else
+ *info_p = info;
}
- key.addend = addend;
- dyn_i = bsearch (&key, info, count,
- sizeof (*info), addend_compare);
+ if (count == 0)
+ dyn_i = NULL;
+ else
+ {
+ key.addend = addend;
+ dyn_i = bsearch (&key, info, count, sizeof (*info), addend_compare);
+ }
}
return dyn_i;
More information about the Binutils-cvs
mailing list