[prev in list] [next in list] [prev in thread] [next in thread]
List: binutils
Subject: Tidy check_uvalue
From: Alan Modra <amodra () gmail ! com>
Date: 2019-08-28 23:45:37
Message-ID: 20190828233337.GC28199 () bubble ! grove ! modra ! org
[Download RAW message or body]
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.
diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index 19ae1edca7..df924e4050 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -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;
--
Alan Modra
Australia Development Lab, IBM
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic