diff options
| author | Roland McGrath <[email protected]> | 2009-01-28 18:29:39 -0800 |
|---|---|---|
| committer | Roland McGrath <[email protected]> | 2009-01-28 18:29:39 -0800 |
| commit | 658674e222fa538f365a713e53403ee9aea94ba1 (patch) | |
| tree | 4f706f6cd6fd3c48ca0d2110917290f173ab5259 /src/readelf.c | |
| parent | 4edd9103e2bb44b8d94f6f2f89aa373fc1ebc392 (diff) | |
| parent | c5acb304d81cdbe3f8b923f2a6ac1bee3af9f498 (diff) | |
Merge commit 'origin/master' into dwarf
Conflicts:
src/ChangeLog
Diffstat (limited to 'src/readelf.c')
| -rw-r--r-- | src/readelf.c | 52 |
1 files changed, 46 insertions, 6 deletions
diff --git a/src/readelf.c b/src/readelf.c index 254cfcef..dadc515f 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -3202,6 +3202,14 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, [DW_OP_bit_piece] = "bit_piece", }; + if (len == 0) + { + printf ("%*s(empty)\n", indent, ""); + return; + } + +#define NEED(n) if (len < n) goto invalid; + Dwarf_Word offset = 0; while (len-- > 0) { @@ -3213,6 +3221,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, case DW_OP_addr:; /* Address operand. */ Dwarf_Word addr; + NEED (addrsize); if (addrsize == 4) addr = read_4ubyte_unaligned (dbg, data); else @@ -3242,6 +3251,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, case DW_OP_pick: case DW_OP_const1u: // XXX value might be modified by relocation + NEED (1); printf ("%*s[%4" PRIuMAX "] %s %" PRIu8 "\n", indent, "", (uintmax_t) offset, known[op], *((uint8_t *) data)); @@ -3251,6 +3261,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, break; case DW_OP_const2u: + NEED (2); // XXX value might be modified by relocation printf ("%*s[%4" PRIuMAX "] %s %" PRIu16 "\n", indent, "", (uintmax_t) offset, @@ -3261,6 +3272,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, break; case DW_OP_const4u: + NEED (4); // XXX value might be modified by relocation printf ("%*s[%4" PRIuMAX "] %s %" PRIu32 "\n", indent, "", (uintmax_t) offset, @@ -3271,6 +3283,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, break; case DW_OP_const8u: + NEED (8); // XXX value might be modified by relocation printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 "\n", indent, "", (uintmax_t) offset, @@ -3281,6 +3294,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, break; case DW_OP_const1s: + NEED (1); // XXX value might be modified by relocation printf ("%*s[%4" PRIuMAX "] %s %" PRId8 "\n", indent, "", (uintmax_t) offset, @@ -3291,6 +3305,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, break; case DW_OP_const2s: + NEED (2); // XXX value might be modified by relocation printf ("%*s[%4" PRIuMAX "] %s %" PRId16 "\n", indent, "", (uintmax_t) offset, @@ -3301,6 +3316,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, break; case DW_OP_const4s: + NEED (4); // XXX value might be modified by relocation printf ("%*s[%4" PRIuMAX "] %s %" PRId32 "\n", indent, "", (uintmax_t) offset, @@ -3311,6 +3327,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, break; case DW_OP_const8s: + NEED (8); // XXX value might be modified by relocation printf ("%*s[%4" PRIuMAX "] %s %" PRId64 "\n", indent, "", (uintmax_t) offset, @@ -3326,7 +3343,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, case DW_OP_constu:; const unsigned char *start = data; unsigned int uleb; - get_uleb128 (uleb, data); + get_uleb128 (uleb, data); /* XXX check overrun */ printf ("%*s[%4" PRIuMAX "] %s %u\n", indent, "", (uintmax_t) offset, known[op], uleb); len -= data - start; @@ -3336,8 +3353,8 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, case DW_OP_bit_piece: start = data; unsigned int uleb2; - get_uleb128 (uleb, data); - get_uleb128 (uleb2, data); + get_uleb128 (uleb, data); /* XXX check overrun */ + get_uleb128 (uleb2, data); /* XXX check overrun */ printf ("%*s[%4" PRIuMAX "] %s %u, %u\n", indent, "", (uintmax_t) offset, known[op], uleb, uleb2); len -= data - start; @@ -3349,7 +3366,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, case DW_OP_consts: start = data; unsigned int sleb; - get_sleb128 (sleb, data); + get_sleb128 (sleb, data); /* XXX check overrun */ printf ("%*s[%4" PRIuMAX "] %s %d\n", indent, "", (uintmax_t) offset, known[op], sleb); len -= data - start; @@ -3358,8 +3375,8 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, case DW_OP_bregx: start = data; - get_uleb128 (uleb, data); - get_sleb128 (sleb, data); + get_uleb128 (uleb, data); /* XXX check overrun */ + get_sleb128 (sleb, data); /* XXX check overrun */ printf ("%*s[%4" PRIuMAX "] %s %u %d\n", indent, "", (uintmax_t) offset, known[op], uleb, sleb); len -= data - start; @@ -3367,9 +3384,26 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, break; case DW_OP_call2: + NEED (2); + printf ("%*s[%4" PRIuMAX "] %s %" PRIu16 "\n", + indent, "", (uintmax_t) offset, known[op], + read_2ubyte_unaligned (dbg, data)); + len -= 2; + offset += 3; + break; + case DW_OP_call4: + NEED (4); + printf ("%*s[%4" PRIuMAX "] %s %" PRIu32 "\n", + indent, "", (uintmax_t) offset, known[op], + read_4ubyte_unaligned (dbg, data)); + len -= 4; + offset += 5; + break; + case DW_OP_skip: case DW_OP_bra: + NEED (2); printf ("%*s[%4" PRIuMAX "] %s %" PRIuMAX "\n", indent, "", (uintmax_t) offset, known[op], (uintmax_t) (offset + read_2sbyte_unaligned (dbg, data))); @@ -3391,6 +3425,12 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest, } indent = indentrest; + continue; + + invalid: + printf (gettext ("%*s[%4" PRIuMAX "] %s <TRUNCATED>\n"), + indent, "", (uintmax_t) offset, known[op]); + break; } } |
