Implement memory management TODOs
[centaur.git] / src / libelfu / model / section.c
index 74fbc3acb19ece9fc26932accb5a25b81cd8333e..d29b510928dbae0613fcf7b3ca504d1c205398f3 100644 (file)
@@ -11,8 +11,6 @@ void* elfu_mScnForall(ElfuElf *me, SectionHandlerFunc f, void *aux1, void *aux2)
   ElfuPhdr *mp;
   ElfuScn *ms;
 
-  // TODO: Sort PHDRs by offset before interating
-
   CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
     if (mp->phdr.p_type != PT_LOAD) {
       continue;
@@ -248,7 +246,29 @@ void elfu_mScnDestroy(ElfuScn* ms)
 {
   assert(ms);
 
-  // TODO: Free symtab/reltab
+  if (!CIRCLEQ_EMPTY(&ms->symtab.syms)) {
+    ElfuSym *nextsym;
+
+    nextsym = CIRCLEQ_FIRST(&ms->symtab.syms);
+    while ((void*)nextsym != (void*)&ms->symtab.syms) {
+      ElfuSym *cursym = nextsym;
+      nextsym = CIRCLEQ_NEXT(cursym, elem);
+      CIRCLEQ_REMOVE(&ms->symtab.syms, cursym, elem);
+      free(cursym);
+    }
+  }
+
+  if (!CIRCLEQ_EMPTY(&ms->reltab.rels)) {
+    ElfuRel *nextrel;
+
+    nextrel = CIRCLEQ_FIRST(&ms->reltab.rels);
+    while ((void*)nextrel != (void*)&ms->reltab.rels) {
+      ElfuRel *currel = nextrel;
+      nextrel = CIRCLEQ_NEXT(currel, elem);
+      CIRCLEQ_REMOVE(&ms->reltab.rels, currel, elem);
+      free(currel);
+    }
+  }
 
   if (ms->databuf) {
     free(ms->databuf);