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
2 changed files with 5 additions and 8 deletions
|
@ -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>
|
2019-08-28 Niklas Gürtler <profclonk@gmail.com>
|
||||||
|
|
||||||
PR 24942
|
PR 24942
|
||||||
|
|
|
@ -1848,16 +1848,9 @@ check_uvalue (const unsigned char * start,
|
||||||
{
|
{
|
||||||
dwarf_vma max_uvalue = end - 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.
|
/* See PR 17512: file: 008-103549-0.001:0.1.
|
||||||
and PR 24829 for examples of where these tests are triggered. */
|
and PR 24829 for examples of where these tests are triggered. */
|
||||||
if (uvalue > max_uvalue
|
if (uvalue > max_uvalue)
|
||||||
|| ptr > end
|
|
||||||
|| ptr < start)
|
|
||||||
{
|
{
|
||||||
warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
|
warn (_("Corrupt attribute block length: %lx\n"), (long) uvalue);
|
||||||
uvalue = max_uvalue;
|
uvalue = max_uvalue;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue