libdwfl: __libdwfl_frame_reg_[gs]et use uint64_t when checking bits.
authorMark Wielaard <mjw@redhat.com>
Tue, 22 Apr 2014 20:52:06 +0000 (22:52 +0200)
committerMark Wielaard <mjw@redhat.com>
Thu, 24 Apr 2014 09:33:54 +0000 (11:33 +0200)
Found by gcc -fsanitize=undefined while running the backtrace-core-ppc test.
runtime error: shift exponent 45 is too large for 32-bit type 'unsigned int'

Signed-off-by: Mark Wielaard <mjw@redhat.com>
libdwfl/ChangeLog
libdwfl/frame_unwind.c

index 1b2e13c..f5ec36c 100644 (file)
@@ -1,3 +1,9 @@
+2014-04-22  Mark Wielaard  <mjw@redhat.com>
+
+       * frame_unwind.c (__libdwfl_frame_reg_get): Use uint64_t when
+       checking bits.
+       (__libdwfl_frame_reg_set): Likewise.
+
 2014-04-22  Kurt Roeckx  <kurt@roeckx.be>
 
        * linux-pid-attach.c: Make linux only.
index dc99e40..18c808b 100644 (file)
@@ -57,7 +57,7 @@ __libdwfl_frame_reg_get (Dwfl_Frame *state, unsigned regno, Dwarf_Addr *val)
   if (regno >= ebl_frame_nregs (ebl))
     return false;
   if ((state->regs_set[regno / sizeof (*state->regs_set) / 8]
-       & (1U << (regno % (sizeof (*state->regs_set) * 8)))) == 0)
+       & ((uint64_t) 1U << (regno % (sizeof (*state->regs_set) * 8)))) == 0)
     return false;
   if (val)
     *val = state->regs[regno];
@@ -77,7 +77,7 @@ __libdwfl_frame_reg_set (Dwfl_Frame *state, unsigned regno, Dwarf_Addr val)
   if (ebl_get_elfclass (ebl) == ELFCLASS32)
     val &= 0xffffffff;
   state->regs_set[regno / sizeof (*state->regs_set) / 8] |=
-                             (1U << (regno % (sizeof (*state->regs_set) * 8)));
+               ((uint64_t) 1U << (regno % (sizeof (*state->regs_set) * 8)));
   state->regs[regno] = val;
   return true;
 }