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:
parent
83cf0d04dc
commit
a85eba51f6
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue