diff options
author | norly <ny-git@enpas.org> | 2013-06-28 03:00:05 +0100 |
---|---|---|
committer | norly <ny-git@enpas.org> | 2013-06-28 03:00:05 +0100 |
commit | 88a99f6bafe7140711fa0095043c856fd8c44dc7 (patch) | |
tree | 387ebd0a82dcf86193438827c39541b072995014 /src/libelfu/model/section.c | |
parent | 50b85e44529f195bf8156e9c0045d8b017ee26f5 (diff) |
Implement memory management TODOs
Diffstat (limited to 'src/libelfu/model/section.c')
-rw-r--r-- | src/libelfu/model/section.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/src/libelfu/model/section.c b/src/libelfu/model/section.c index 74fbc3a..d29b510 100644 --- a/src/libelfu/model/section.c +++ b/src/libelfu/model/section.c @@ -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); |