diff options
| author | Mark Wielaard <[email protected]> | 2014-12-15 19:05:43 +0100 |
|---|---|---|
| committer | Mark Wielaard <[email protected]> | 2014-12-17 16:47:16 +0100 |
| commit | 198e9490dee64cb9eb5a41daa7bda9ff97d52d32 (patch) | |
| tree | aad6a7574a4417323d7448250fe0d158f7da5e26 /src | |
| parent | 138a9ba2be7e2df2423f86c9ddcca7322648e426 (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/ChangeLog | 5 | ||||
| -rw-r--r-- | src/readelf.c | 23 |
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); |
