summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/elfucli.c8
-rw-r--r--src/libelfu/model/elf.c51
-rw-r--r--src/libelfu/model/phdr.c19
-rw-r--r--src/libelfu/model/section.c13
-rw-r--r--src/libelfu/modelops/fromFile.c12
5 files changed, 93 insertions, 10 deletions
diff --git a/src/elfucli.c b/src/elfucli.c
index cd8f0ba..b3ea29f 100644
--- a/src/elfucli.c
+++ b/src/elfucli.c
@@ -84,6 +84,10 @@ int main(int argc, char **argv)
}
break;
case 'i':
+ if (me) {
+ elfu_mElfDestroy(me);
+ }
+
printf("Opening input file %s.\n", optarg);
openElf(&hIn, optarg, ELF_C_READ);
if (!hIn.e) {
@@ -200,6 +204,10 @@ int main(int argc, char **argv)
EXIT:
+ if (me) {
+ elfu_mElfDestroy(me);
+ }
+
if (hIn.e) {
closeElf(&hIn);
}
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");