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



_______________________________________________
Elftoolchain-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/elftoolchain-developers

Reply via email to