summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMark Wielaard <[email protected]>2014-12-15 19:05:43 +0100
committerMark Wielaard <[email protected]>2014-12-17 16:47:16 +0100
commit198e9490dee64cb9eb5a41daa7bda9ff97d52d32 (patch)
treeaad6a7574a4417323d7448250fe0d158f7da5e26 /src
parent138a9ba2be7e2df2423f86c9ddcca7322648e426 (diff)
readelf: Don't assert when addr_size or ref_size is not 4 or 8 in print_ops.
Just report invalid data and continue. Signed-off-by: Mark Wielaard <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog5
-rw-r--r--src/readelf.c23
2 files changed, 13 insertions, 15 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 2cf953e6..1f91de60 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,10 @@
2014-12-15 Mark Wielaard <[email protected]>
+ * readelf.c (print_ops): Don't assert when addr_size or ref_size
+ is not 4 or 8, just report invalid data.
+
+2014-12-15 Mark Wielaard <[email protected]>
+
* readelf.c (print_gdb_index_section): Add more bounds checks.
2014-12-15 Mark Wielaard <[email protected]>
diff --git a/src/readelf.c b/src/readelf.c
index 41239bca..aa85d73a 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -3981,11 +3981,10 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
NEED (addrsize);
if (addrsize == 4)
addr = read_4ubyte_unaligned (dbg, data);
+ else if (addrsize == 8)
+ addr = read_8ubyte_unaligned (dbg, data);
else
- {
- assert (addrsize == 8);
- addr = read_8ubyte_unaligned (dbg, data);
- }
+ goto invalid;
data += addrsize;
CONSUME (addrsize);
@@ -3999,16 +3998,13 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
case DW_OP_call_ref:
/* Offset operand. */
- if (ref_size == 0)
+ if (ref_size != 4 && ref_size != 8)
goto invalid; /* Cannot be used in CFA. */
NEED (ref_size);
if (ref_size == 4)
addr = read_4ubyte_unaligned (dbg, data);
else
- {
- assert (ref_size == 8);
- addr = read_8ubyte_unaligned (dbg, data);
- }
+ addr = read_8ubyte_unaligned (dbg, data);
data += ref_size;
CONSUME (ref_size);
@@ -4206,16 +4202,13 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
case DW_OP_GNU_implicit_pointer:
/* DIE offset operand. */
start = data;
- NEED (ref_size + 1);
- if (ref_size == 0)
+ NEED (ref_size);
+ if (ref_size != 4 && ref_size != 8)
goto invalid; /* Cannot be used in CFA. */
if (ref_size == 4)
addr = read_4ubyte_unaligned (dbg, data);
else
- {
- assert (ref_size == 8);
- addr = read_8ubyte_unaligned (dbg, data);
- }
+ addr = read_8ubyte_unaligned (dbg, data);
data += ref_size;
/* Byte offset operand. */
NEED (1);