summaryrefslogtreecommitdiff
path: root/src/libelfu/model/phdr.c
diff options
context:
space:
mode:
authornorly <ny-git@enpas.org>2013-06-28 03:00:05 +0100
committernorly <ny-git@enpas.org>2013-06-28 03:00:05 +0100
commit88a99f6bafe7140711fa0095043c856fd8c44dc7 (patch)
tree387ebd0a82dcf86193438827c39541b072995014 /src/libelfu/model/phdr.c
parent50b85e44529f195bf8156e9c0045d8b017ee26f5 (diff)
Implement memory management TODOs
Diffstat (limited to 'src/libelfu/model/phdr.c')
-rw-r--r--src/libelfu/model/phdr.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/src/libelfu/model/phdr.c b/src/libelfu/model/phdr.c
index b694eb9..6f31e6b 100644
--- a/src/libelfu/model/phdr.c
+++ b/src/libelfu/model/phdr.c
@@ -194,19 +194,30 @@ ElfuPhdr* elfu_mPhdrAlloc()
void elfu_mPhdrDestroy(ElfuPhdr* mp)
{
- ElfuPhdr *mp2;
- ElfuScn *ms;
-
assert(mp);
- CIRCLEQ_FOREACH(mp2, &mp->childPhdrList, elemChildPhdr) {
- CIRCLEQ_REMOVE(&mp->childPhdrList, mp2, elemChildPhdr);
- elfu_mPhdrDestroy(mp2);
+ if (!CIRCLEQ_EMPTY(&mp->childPhdrList)) {
+ ElfuPhdr *nextmp;
+
+ nextmp = CIRCLEQ_FIRST(&mp->childPhdrList);
+ while ((void*)nextmp != (void*)&mp->childPhdrList) {
+ ElfuPhdr *curmp = nextmp;
+ nextmp = CIRCLEQ_NEXT(curmp, elemChildPhdr);
+ CIRCLEQ_REMOVE(&mp->childPhdrList, curmp, elemChildPhdr);
+ elfu_mPhdrDestroy(curmp);
+ }
}
- CIRCLEQ_FOREACH(ms, &mp->childScnList, elemChildScn) {
- CIRCLEQ_REMOVE(&mp->childScnList, ms, elemChildScn);
- elfu_mScnDestroy(ms);
+ if (!CIRCLEQ_EMPTY(&mp->childScnList)) {
+ ElfuScn *nextms;
+
+ nextms = CIRCLEQ_FIRST(&mp->childScnList);
+ while ((void*)nextms != (void*)&mp->childScnList) {
+ ElfuScn *curms = nextms;
+ nextms = CIRCLEQ_NEXT(curms, elemChildScn);
+ CIRCLEQ_REMOVE(&mp->childScnList, curms, elemChildScn);
+ elfu_mScnDestroy(curms);
+ }
}
free(mp);