From 198e9490dee64cb9eb5a41daa7bda9ff97d52d32 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 15 Dec 2014 19:05:43 +0100 Subject: [PATCH] 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 --- src/ChangeLog | 5 +++++ src/readelf.c | 23 ++++++++--------------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 2cf953e..1f91de6 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,10 @@ 2014-12-15 Mark Wielaard + * 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 + * readelf.c (print_gdb_index_section): Add more bounds checks. 2014-12-15 Mark Wielaard diff --git a/src/readelf.c b/src/readelf.c index 41239bc..aa85d73 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); -- 2.7.4