summaryrefslogtreecommitdiff
path: root/src/libelfu/modelops/reladd.c
diff options
context:
space:
mode:
authornorly <ny-git@enpas.org>2013-06-21 00:41:14 +0100
committernorly <ny-git@enpas.org>2013-06-21 00:42:22 +0100
commit272d88460cae164fe310ba905c58e1834eb4eecd (patch)
treec6590895be53bbe4c8f51c12e396adb46cecdbdf /src/libelfu/modelops/reladd.c
parente68a6c6cc16279c72e270daae0548ea7c0f11c6e (diff)
Merge cloneScn() into reladd.c
It's the only place where we use it, and it's case-specific
Diffstat (limited to 'src/libelfu/modelops/reladd.c')
-rw-r--r--src/libelfu/modelops/reladd.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/libelfu/modelops/reladd.c b/src/libelfu/modelops/reladd.c
index 8c56d4f..6ab54e0 100644
--- a/src/libelfu/modelops/reladd.c
+++ b/src/libelfu/modelops/reladd.c
@@ -5,6 +5,37 @@
#include <libelfu/libelfu.h>
+static ElfuScn* cloneScn(ElfuScn *ms)
+{
+ ElfuScn *newscn;
+
+ assert(ms);
+
+ newscn = elfu_mScnAlloc();
+ if (!newscn) {
+ return NULL;
+ }
+
+ newscn->shdr = ms->shdr;
+
+ if (ms->databuf) {
+ void *newbuf = malloc(ms->shdr.sh_size);
+ if (!newbuf) {
+ ELFU_WARN("cloneScn: Could not allocate memory for new data buffer.\n");
+ free(newscn);
+ return NULL;
+ }
+
+ memcpy(newbuf, ms->databuf, ms->shdr.sh_size);
+ newscn->databuf = newbuf;
+ }
+
+ newscn->oldptr = ms;
+
+ return newscn;
+}
+
+
static int appendData(ElfuScn *ms, void *buf, size_t len)
{
char *newbuf;
@@ -36,7 +67,7 @@ static ElfuScn* insertSection(ElfuElf *me, ElfuElf *mrel, ElfuScn *oldscn)
ElfuPhdr *injPhdr;
if (oldscn->shdr.sh_flags & SHF_ALLOC) {
- newscn = elfu_mCloneScn(oldscn);
+ newscn = cloneScn(oldscn);
if (!newscn) {
return NULL;
}