Tidy check_uvalue
authorAlan Modra <amodra@gmail.com>
Wed, 28 Aug 2019 23:34:08 +0000 (09:04 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 28 Aug 2019 23:34:35 +0000 (09:04 +0930)
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.

binutils/ChangeLog
binutils/dwarf.c

index 1148e9d..98e660d 100644 (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
index 19ae1ed..df924e4 100644 (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;