Tidy check_uvalue

I don't see a need to calculate "ptr = start + uvalue" then compare
"ptr" with "start" and "end".  Given "start <= end" on entry, the
"uvalue" comparison with "max_uvalue" ought to be sufficient to ensure
"start + uvalue" is bounded by "start" and "end" regardless of the
size of pointers and the unsigned dwarf_vma integer type.

	* dwarf.c (check_uvalue): Remove unnecessary pointer checks.
This commit is contained in:
Alan Modra 2019-08-29 09:04:08 +09:30
parent 83cf0d04dc
commit a85eba51f6
2 changed files with 5 additions and 8 deletions

View File

@ -1,3 +1,7 @@
2019-08-29 Alan Modra <amodra@gmail.com>
* dwarf.c (check_uvalue): Remove unnecessary pointer checks.
2019-08-28 Niklas Gürtler <profclonk@gmail.com>
PR 24942

View File

@ -1848,16 +1848,9 @@ check_uvalue (const unsigned char * start,
{
dwarf_vma max_uvalue = end - start;
/* FIXME: Testing "(start + uvalue) < start" miscompiles with gcc 4.8.3
running on an x86_64 host in 32-bit mode. So we pre-compute the value
here. */
const unsigned char * ptr = start + uvalue;
/* See PR 17512: file: 008-103549-0.001:0.1.
and PR 24829 for examples of where these tests are triggered. */
if (uvalue > max_uvalue
|| ptr > end
|| ptr < start)
if (uvalue > max_uvalue)
{
warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
uvalue = max_uvalue;