printf("--reladd: Injecting %s...\n", optarg);
if (elfu_mCheck(mrel)) {
printf("--reladd: Check for input file failed.\n");
+ elfu_mElfDestroy(mrel);
goto ERR;
}
if (elfu_mReladd(me, mrel)) {
printf("--reladd: Failed.\n");
+ elfu_mElfDestroy(mrel);
goto ERR;
}
printf("--reladd: Injected %s.\n", optarg);
+ elfu_mElfDestroy(mrel);
}
}
break;
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);
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);
ElfuPhdr *mp;
ElfuScn *ms;
- // TODO: Sort PHDRs by offset before interating
-
CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
if (mp->phdr.p_type != PT_LOAD) {
continue;
{
assert(ms);
- // TODO: Free symtab/reltab
+ if (!CIRCLEQ_EMPTY(&ms->symtab.syms)) {
+ ElfuSym *nextsym;
+
+ nextsym = CIRCLEQ_FIRST(&ms->symtab.syms);
+ while ((void*)nextsym != (void*)&ms->symtab.syms) {
+ ElfuSym *cursym = nextsym;
+ nextsym = CIRCLEQ_NEXT(cursym, elem);
+ CIRCLEQ_REMOVE(&ms->symtab.syms, cursym, elem);
+ free(cursym);
+ }
+ }
+
+ if (!CIRCLEQ_EMPTY(&ms->reltab.rels)) {
+ ElfuRel *nextrel;
+
+ nextrel = CIRCLEQ_FIRST(&ms->reltab.rels);
+ while ((void*)nextrel != (void*)&ms->reltab.rels) {
+ ElfuRel *currel = nextrel;
+ nextrel = CIRCLEQ_NEXT(currel, elem);
+ CIRCLEQ_REMOVE(&ms->reltab.rels, currel, elem);
+ free(currel);
+ }
+ }
if (ms->databuf) {
free(ms->databuf);
}
}
-
+ if (secArray) {
+ free(secArray);
+ }
return me;
ElfuPhdr *highestOffsEnd;
ElfuPhdr *mp;
ElfuScn *ms;
- ElfuPhdr **phdrArr;
GElf_Off lastend = 0;
assert(me);
elfu_mPhdrLoadLowestHighest(me, &lowestAddr, &highestAddr,
&lowestOffs, &highestOffsEnd);
- phdrArr = malloc(elfu_mPhdrCount(me) * sizeof(*phdrArr));
- if (!phdrArr) {
- ELFU_WARN("elfu_mLayoutAuto: malloc failed for phdrArr.\n");
- return 1;
- }
-
lastend = OFFS_END(highestOffsEnd->phdr.p_offset, highestOffsEnd->phdr.p_filesz);
ERROR:
if (newscn) {
- // TODO: Destroy newscn
+ elfu_mScnDestroy(newscn);
}
return NULL;
}