Fix a potentially undefined right shift by replacing it with two smaller right shifts.
authorNick Clifton <nickc@redhat.com>
Thu, 5 Mar 2015 17:26:10 +0000 (17:26 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 5 Mar 2015 17:26:10 +0000 (17:26 +0000)
PR binutils/17765
* elflink.c (put_value): Avoid using an undefined shift
operation.

bfd/ChangeLog
bfd/elflink.c

index f29dec51560273202a7af44b89fefdcc762e3fd0..6810f6b99b3ab75547d9709d00e7f103652762bb 100644 (file)
@@ -1,3 +1,9 @@
+2015-03-05  Nick Clifton  <nickc@redhat.com>
+
+       PR binutils/17765
+       * elflink.c (put_value): Avoid using an undefined shift
+       operation.
+
 2015-03-05  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/pr15228
index 6ee649901d39d4942285053fe0a3714f4a514cec..b285e765de7a01893a1a42cab0695781f6890a39 100644 (file)
@@ -7793,28 +7793,32 @@ put_value (bfd_vma size,
 {
   location += (size - chunksz);
 
-  for (; size; size -= chunksz, location -= chunksz, x >>= (chunksz * 8))
+  for (; size; size -= chunksz, location -= chunksz)
     {
       switch (chunksz)
        {
-       default:
-       case 0:
-         abort ();
        case 1:
          bfd_put_8 (input_bfd, x, location);
+         x >>= 8;
          break;
        case 2:
          bfd_put_16 (input_bfd, x, location);
+         x >>= 16;
          break;
        case 4:
          bfd_put_32 (input_bfd, x, location);
+         x >>= 32;
          break;
-       case 8:
 #ifdef BFD64
+       case 8:
          bfd_put_64 (input_bfd, x, location);
-#else
-         abort ();
+         /* Computed this way because x >>= 64 is undefined if x is a 64-bit value.  */
+         x >>= 32;
+         x >>= 32;
+         break;
 #endif
+       default:
+         abort ();
          break;
        }
     }
This page took 0.28352 seconds and 4 git commands to generate.