From: Christos M. <chr...@ma...> - 2023-02-28 15:24:10
|
Fixed broken -wR option, and various memory leaks. Relevant PR: https://reviews.freebsd.org/D38419 --- readelf/readelf.c | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/readelf/readelf.c b/readelf/readelf.c index d3b1bb51..134bf0bf 100644 --- a/readelf/readelf.c +++ b/readelf/readelf.c @@ -4701,8 +4701,10 @@ dump_dwarf_line(struct readelf *re) return; } if (dwarf_attrval_unsigned(die, DW_AT_stmt_list, &offset, - &de) != DW_DLV_OK) + &de) != DW_DLV_OK) { + dwarf_dealloc(re->dbg, die, DW_DLA_DIE); continue; + } length = re->dw_read(d, &offset, 4); if (length == 0xffffffff) { @@ -4713,6 +4715,7 @@ dump_dwarf_line(struct readelf *re) if (length > d->d_size - offset) { warnx("invalid .dwarf_line section"); + dwarf_dealloc(re->dbg, die, DW_DLA_DIE); continue; } @@ -4913,6 +4916,7 @@ dump_dwarf_line(struct readelf *re) } + dwarf_dealloc(re->dbg, die, DW_DLA_DIE); } if (ret == DW_DLV_ERROR) warnx("dwarf_next_cu_header: %s", dwarf_errmsg(de)); @@ -4955,9 +4959,9 @@ dump_dwarf_line_decoded(struct readelf *re) printf("%-37s %11s %s\n", "Filename", "Line Number", "Starting Address"); if (dwarf_srclines(die, &linebuf, &linecount, &de) != DW_DLV_OK) - continue; + goto done; if (dwarf_srcfiles(die, &srcfiles, &srccount, &de) != DW_DLV_OK) - continue; + goto done; for (i = 0; i < linecount; i++) { ln = linebuf[i]; if (dwarf_line_srcfileno(ln, &fn, &de) != DW_DLV_OK) @@ -4971,6 +4975,8 @@ dump_dwarf_line_decoded(struct readelf *re) (uintmax_t) lineaddr); } putchar('\n'); +done: + dwarf_dealloc(re->dbg, die, DW_DLA_DIE); } } @@ -5603,7 +5609,8 @@ dump_dwarf_ranges_foreach(struct readelf *re, Dwarf_Die die, Dwarf_Addr base) Dwarf_Addr base0; Dwarf_Half attr; Dwarf_Signed attr_count, cnt; - Dwarf_Unsigned off, bytecnt; + Dwarf_Unsigned bytecnt; + Dwarf_Off off; int i, j, ret; if ((ret = dwarf_attrlist(die, &attr_list, &attr_count, &de)) != @@ -5620,8 +5627,9 @@ dump_dwarf_ranges_foreach(struct readelf *re, Dwarf_Die die, Dwarf_Addr base) } if (attr != DW_AT_ranges) continue; - if (dwarf_formudata(attr_list[i], &off, &de) != DW_DLV_OK) { - warnx("dwarf_formudata failed: %s", dwarf_errmsg(de)); + if (dwarf_global_formref(attr_list[i], &off, &de) != DW_DLV_OK) { + warnx("dwarf_global_formred failed: %s", + dwarf_errmsg(de)); continue; } if (dwarf_get_ranges(re->dbg, (Dwarf_Off) off, &ranges, &cnt, @@ -5663,6 +5671,8 @@ cont_search: warnx("dwarf_siblingof: %s", dwarf_errmsg(de)); else if (ret == DW_DLV_OK) dump_dwarf_ranges_foreach(re, ret_die, base); + + dwarf_dealloc(re->dbg, die, DW_DLA_DIE); } static void @@ -5966,7 +5976,7 @@ dump_dwarf_frame_section(struct readelf *re, struct section *s, int alt) Dwarf_Small cie_version; Dwarf_Ptr fde_addr, fde_inst, cie_inst; char *cie_aug, c; - int i, eh_frame; + int i, ret, eh_frame; Dwarf_Error de; printf("\nThe section %s contains:\n\n", s->name); @@ -5981,10 +5991,13 @@ dump_dwarf_frame_section(struct readelf *re, struct section *s, int alt) } } else if (!strcmp(s->name, ".eh_frame")) { eh_frame = 1; - if (dwarf_get_fde_list_eh(re->dbg, &cie_list, &cie_count, - &fde_list, &fde_count, &de) != DW_DLV_OK) { - warnx("dwarf_get_fde_list_eh failed: %s", - dwarf_errmsg(de)); + ret = dwarf_get_fde_list_eh(re->dbg, &cie_list, &cie_count, + &fde_list, &fde_count, &de); + if (ret != DW_DLV_OK) { + if (ret == DW_DLV_ERROR) { + warnx("dwarf_get_fde_list_eh failed: %s", + dwarf_errmsg(de)); + } return; } } else -- 2.39.2 |