https://gcc.gnu.org/g:5d43c3f08bca01c48aac851e1195f03b9319091d

commit r15-7297-g5d43c3f08bca01c48aac851e1195f03b9319091d
Author: Ian Lance Taylor <i...@golang.org>
Date:   Thu Jan 30 15:20:23 2025 -0800

    libbacktrace: add casts to avoid undefined shifts
    
    Patch from pgerell@github.
    
            * elf.c (elf_fetch_bits): Add casts to avoid potentially shifting
            a value farther than its type size.
            (elf_fetch_bits_backward): Likewise.
            (elf_uncompress_lzma_block): Likewise.
            (elf_uncompress_lzma): Likewise.

Diff:
---
 libbacktrace/elf.c | 34 ++++++++++++++++++++--------------
 1 file changed, 20 insertions(+), 14 deletions(-)

diff --git a/libbacktrace/elf.c b/libbacktrace/elf.c
index a450f3535c66..d766fa41a61c 100644
--- a/libbacktrace/elf.c
+++ b/libbacktrace/elf.c
@@ -1147,7 +1147,10 @@ elf_fetch_bits (const unsigned char **ppin, const 
unsigned char *pinend,
   next = __builtin_bswap32 (next);
 #endif
 #else
-  next = pin[0] | (pin[1] << 8) | (pin[2] << 16) | (pin[3] << 24);
+  next = ((uint32_t)pin[0]
+         | ((uint32_t)pin[1] << 8)
+         | ((uint32_t)pin[2] << 16)
+         | ((uint32_t)pin[3] << 24));
 #endif
 
   val |= (uint64_t)next << bits;
@@ -1198,7 +1201,10 @@ elf_fetch_bits_backward (const unsigned char **ppin,
   next = __builtin_bswap32 (next);
 #endif
 #else
-  next = pin[0] | (pin[1] << 8) | (pin[2] << 16) | (pin[3] << 24);
+  next = ((uint32_t)pin[0]
+         | ((uint32_t)pin[1] << 8)
+         | ((uint32_t)pin[2] << 16)
+         | ((uint32_t)pin[3] << 24));
 #endif
 
   val <<= 32;
@@ -5872,10 +5878,10 @@ elf_uncompress_lzma_block (const unsigned char 
*compressed,
          /* The byte at compressed[off] is ignored for some
             reason.  */
 
-         code = ((compressed[off + 1] << 24)
-                 + (compressed[off + 2] << 16)
-                 + (compressed[off + 3] << 8)
-                 + compressed[off + 4]);
+         code = ((uint32_t)(compressed[off + 1] << 24)
+                 + ((uint32_t)compressed[off + 2] << 16)
+                 + ((uint32_t)compressed[off + 3] << 8)
+                 + (uint32_t)compressed[off + 4]);
          off += 5;
 
          /* This is the main LZMA decode loop.  */
@@ -6198,10 +6204,10 @@ elf_uncompress_lzma_block (const unsigned char 
*compressed,
          return 0;
        }
       computed_crc = elf_crc32 (0, uncompressed, uncompressed_offset);
-      stream_crc = (compressed[off]
-                   | (compressed[off + 1] << 8)
-                   | (compressed[off + 2] << 16)
-                   | (compressed[off + 3] << 24));
+      stream_crc = ((uint32_t)compressed[off]
+                   | ((uint32_t)compressed[off + 1] << 8)
+                   | ((uint32_t)compressed[off + 2] << 16)
+                   | ((uint32_t)compressed[off + 3] << 24));
       if (computed_crc != stream_crc)
        {
          elf_uncompress_failed ();
@@ -6336,10 +6342,10 @@ elf_uncompress_lzma (struct backtrace_state *state,
 
   /* Before that is the size of the index field, which precedes the
      footer.  */
-  index_size = (compressed[offset - 4]
-               | (compressed[offset - 3] << 8)
-               | (compressed[offset - 2] << 16)
-               | (compressed[offset - 1] << 24));
+  index_size = ((size_t)compressed[offset - 4]
+               | ((size_t)compressed[offset - 3] << 8)
+               | ((size_t)compressed[offset - 2] << 16)
+               | ((size_t)compressed[offset - 1] << 24));
   index_size = (index_size + 1) * 4;
   offset -= 4;

Reply via email to