summaryrefslogtreecommitdiff
path: root/src/libelfu/model/elf.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libelfu/model/elf.c')
-rw-r--r--src/libelfu/model/elf.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/src/libelfu/model/elf.c b/src/libelfu/model/elf.c
index a25aa89..11346a5 100644
--- a/src/libelfu/model/elf.c
+++ b/src/libelfu/model/elf.c
@@ -29,22 +29,30 @@ ElfuElf* elfu_mElfAlloc()
void elfu_mElfDestroy(ElfuElf* me)
{
- ElfuPhdr *mp;
- ElfuScn *ms;
-
assert(me);
- CIRCLEQ_INIT(&me->phdrList);
- CIRCLEQ_INIT(&me->orphanScnList);
+ if (!CIRCLEQ_EMPTY(&me->phdrList)) {
+ ElfuPhdr *nextmp;
- CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
- CIRCLEQ_REMOVE(&me->phdrList, mp, elem);
- elfu_mPhdrDestroy(mp);
+ nextmp = CIRCLEQ_FIRST(&me->phdrList);
+ while ((void*)nextmp != (void*)&me->phdrList) {
+ ElfuPhdr *curmp = nextmp;
+ nextmp = CIRCLEQ_NEXT(curmp, elem);
+ CIRCLEQ_REMOVE(&me->phdrList, curmp, elem);
+ elfu_mPhdrDestroy(curmp);
+ }
}
- CIRCLEQ_FOREACH(ms, &me->orphanScnList, elemChildScn) {
- CIRCLEQ_REMOVE(&me->orphanScnList, ms, elemChildScn);
- elfu_mScnDestroy(ms);
+ if (!CIRCLEQ_EMPTY(&me->orphanScnList)) {
+ ElfuScn *nextms;
+
+ nextms = CIRCLEQ_FIRST(&me->orphanScnList);
+ while ((void*)nextms != (void*)&me->orphanScnList) {
+ ElfuScn *curms = nextms;
+ nextms = CIRCLEQ_NEXT(curms, elemChildScn);
+ CIRCLEQ_REMOVE(&me->orphanScnList, curms, elemChildScn);
+ elfu_mScnDestroy(curms);
+ }
}
free(me);