2014-12-15 Mark Wielaard <mjw@redhat.com>
+ * 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 <mjw@redhat.com>
+
* readelf.c (print_gdb_index_section): Add more bounds checks.
2014-12-15 Mark Wielaard <mjw@redhat.com>
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);
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);
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);