summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wielaard <mjw@redhat.com>2014-04-22 22:52:06 +0200
committerMark Wielaard <mjw@redhat.com>2014-04-24 11:33:54 +0200
commit740d1fe49758f28aad50b1d67b139a1564d73bbd (patch)
tree4ceb7bb6994e16ec0bc9a78db9a171fb636ea7c9
parent7c757b33fd6c975f1f0976eaa9e971432cc031b2 (diff)
downloadelfutils-740d1fe49758f28aad50b1d67b139a1564d73bbd.tar.gz
libdwfl: __libdwfl_frame_reg_[gs]et use uint64_t when checking bits.
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>
-rw-r--r--libdwfl/ChangeLog6
-rw-r--r--libdwfl/frame_unwind.c4
2 files changed, 8 insertions, 2 deletions
diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog
index 1b2e13c3..f5ec36c4 100644
--- a/libdwfl/ChangeLog
+++ b/libdwfl/ChangeLog
@@ -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.
diff --git a/libdwfl/frame_unwind.c b/libdwfl/frame_unwind.c
index dc99e40b..18c808b2 100644
--- a/libdwfl/frame_unwind.c
+++ b/libdwfl/frame_unwind.c
@@ -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;
}