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.
This commit is contained in:
Alan Modra
2020-08-29 10:30:07 +09:30
parent 9b5f4ffe1b
commit 736c9875c0
2 changed files with 27 additions and 19 deletions

View File

@ -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> 2020-08-28 Alan Modra <amodra@gmail.com>
PR 26418 PR 26418

View File

@ -1867,18 +1867,16 @@ get_dyn_sym_info (struct elfNN_ia64_link_hash_table *ia64_info,
key.addend = addend; key.addend = addend;
dyn_i = bsearch (&key, info, sorted_count, dyn_i = bsearch (&key, info, sorted_count,
sizeof (*info), addend_compare); sizeof (*info), addend_compare);
if (dyn_i) if (dyn_i)
{ return dyn_i;
return dyn_i;
}
} }
/* Do a quick check for the last inserted entry. */ if (count != 0)
dyn_i = info + count - 1;
if (dyn_i->addend == addend)
{ {
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) if (size != count)
{ {
amt = count * sizeof (*info); amt = count * sizeof (*info);
info = bfd_malloc (amt); info = bfd_realloc (info, amt);
if (info != NULL) *size_p = count;
{ if (info == NULL && count != 0)
memcpy (info, *info_p, amt); /* realloc should never fail since we are reducing size here,
free (*info_p); but if it does use the old array. */
*size_p = count; info = *info_p;
*info_p = info; else
} *info_p = info;
} }
key.addend = addend; if (count == 0)
dyn_i = bsearch (&key, info, count, dyn_i = NULL;
sizeof (*info), addend_compare); else
{
key.addend = addend;
dyn_i = bsearch (&key, info, count, sizeof (*info), addend_compare);
}
} }
return dyn_i; return dyn_i;