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/phdr.c | |
parent | 50b85e44529f195bf8156e9c0045d8b017ee26f5 (diff) |
Implement memory management TODOs
Diffstat (limited to 'src/libelfu/model/phdr.c')
-rw-r--r-- | src/libelfu/model/phdr.c | 29 |
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); |