diff options
Diffstat (limited to 'src/libelfu')
-rw-r--r-- | src/libelfu/model/elf.c | 51 | ||||
-rw-r--r-- | src/libelfu/model/phdr.c | 19 | ||||
-rw-r--r-- | src/libelfu/model/section.c | 13 | ||||
-rw-r--r-- | src/libelfu/modelops/fromFile.c | 12 |
4 files changed, 85 insertions, 10 deletions
diff --git a/src/libelfu/model/elf.c b/src/libelfu/model/elf.c new file mode 100644 index 0000000..46dc120 --- /dev/null +++ b/src/libelfu/model/elf.c @@ -0,0 +1,51 @@ +#include <assert.h> +#include <stdlib.h> +#include <string.h> +#include <libelfu/libelfu.h> + + +/* + * Allocation, destruction + */ + +ElfuElf* elfu_mElfAlloc() +{ + ElfuElf *me; + + me = malloc(sizeof(ElfuElf)); + if (!me) { + ELFU_WARN("mElfAlloc: malloc() failed for ElfuElf.\n"); + return NULL; + } + + memset(me, 0, sizeof(*me)); + + CIRCLEQ_INIT(&me->phdrList); + CIRCLEQ_INIT(&me->orphanScnList); + + return me; +} + + +void elfu_mElfDestroy(ElfuElf* me) +{ + ElfuPhdr *mp; + ElfuScn *ms; + + assert(me); + + CIRCLEQ_INIT(&me->phdrList); + CIRCLEQ_INIT(&me->orphanScnList); + + CIRCLEQ_FOREACH(mp, &me->phdrList, elem) { + CIRCLEQ_REMOVE(&me->phdrList, mp, elem); + elfu_mPhdrDestroy(mp); + } + + CIRCLEQ_FOREACH(ms, &me->orphanScnList, elem) { + CIRCLEQ_REMOVE(&me->orphanScnList, ms, elem); + elfu_mScnDestroy(ms); + } + + free(me); +} diff --git a/src/libelfu/model/phdr.c b/src/libelfu/model/phdr.c index ce395ec..6896845 100644 --- a/src/libelfu/model/phdr.c +++ b/src/libelfu/model/phdr.c @@ -60,3 +60,22 @@ ElfuPhdr* elfu_mPhdrAlloc() return mp; } + +void elfu_mPhdrDestroy(ElfuPhdr* mp) +{ + ElfuPhdr *mp2; + ElfuScn *ms; + + assert(mp); + + CIRCLEQ_FOREACH(mp2, &mp->childPhdrList, elem) { + // TODO ? + } + + CIRCLEQ_FOREACH(ms, &mp->childScnList, elem) { + CIRCLEQ_REMOVE(&mp->childScnList, ms, elem); + elfu_mScnDestroy(ms); + } + + free(mp); +} diff --git a/src/libelfu/model/section.c b/src/libelfu/model/section.c index c93c5c8..9ef6fd8 100644 --- a/src/libelfu/model/section.c +++ b/src/libelfu/model/section.c @@ -219,3 +219,16 @@ ElfuScn* elfu_mScnAlloc() return ms; } + +void elfu_mScnDestroy(ElfuScn* ms) +{ + assert(ms); + + // TODO: Free symtab/reltab + + if (ms->databuf) { + free(ms->databuf); + } + + free(ms); +} diff --git a/src/libelfu/modelops/fromFile.c b/src/libelfu/modelops/fromFile.c index 9671b5f..e19df7b 100644 --- a/src/libelfu/modelops/fromFile.c +++ b/src/libelfu/modelops/fromFile.c @@ -290,19 +290,11 @@ ElfuElf* elfu_mFromElf(Elf *e) goto ERROR; } - me = malloc(sizeof(ElfuElf)); + me = elfu_mElfAlloc(); if (!me) { - ELFU_WARN("elfu_mFromElf: malloc() failed for ElfuElf.\n"); goto ERROR; } - - /* General stuff */ - CIRCLEQ_INIT(&me->phdrList); - CIRCLEQ_INIT(&me->orphanScnList); - me->shstrtab = NULL; - me->symtab = NULL; - me->elfclass = gelf_getclass(e); assert(me->elfclass != ELFCLASSNONE); assert(gelf_getehdr(e, &me->ehdr) == &me->ehdr); @@ -473,7 +465,7 @@ ElfuElf* elfu_mFromElf(Elf *e) free(secArray); } if (me) { - // TODO: Free data structures + elfu_mElfDestroy(me); } ELFU_WARN("elfu_mFromElf: Failed to load file.\n"); |