summaryrefslogtreecommitdiff
path: root/src/model
diff options
context:
space:
mode:
authornorly <ny-git@enpas.org>2013-05-27 14:53:33 +0100
committernorly <ny-git@enpas.org>2013-05-27 14:53:33 +0100
commitc6fc85f5f72c738c7d1764d1894a33778be6ef31 (patch)
tree8f0d35c37a9d1b26297e0f40af8948160d83b6ad /src/model
parent147edc30e5afb3fa0b17727fde972a0c1a9b275f (diff)
Restrict sh_link/sh_info evaluation where possible
Diffstat (limited to 'src/model')
-rw-r--r--src/model/fromFile.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/model/fromFile.c b/src/model/fromFile.c
index 125ea77..bd085f6 100644
--- a/src/model/fromFile.c
+++ b/src/model/fromFile.c
@@ -124,7 +124,8 @@ static ElfuScn* modelFromSection(Elf_Scn *scn)
}
}
- ms->link = NULL;
+ ms->linkptr = NULL;
+ ms->infoptr = NULL;
return ms;
@@ -224,8 +225,22 @@ ElfuElf* elfu_mFromElf(Elf *e)
for (i = 0; i < numShdr - 1; i++) {
ElfuScn *ms = secArray[i];
- if (ms->shdr.sh_link > 0) {
- ms->link = secArray[ms->shdr.sh_link - 1];
+ switch (ms->shdr.sh_type) {
+ case SHT_REL:
+ case SHT_RELA:
+ if (ms->shdr.sh_info > 0) {
+ ms->infoptr = secArray[ms->shdr.sh_info - 1];
+ }
+ case SHT_DYNAMIC:
+ case SHT_HASH:
+ case SHT_SYMTAB:
+ case SHT_DYNSYM:
+ case SHT_GNU_versym:
+ case SHT_GNU_verdef:
+ case SHT_GNU_verneed:
+ if (ms->shdr.sh_link > 0) {
+ ms->linkptr = secArray[ms->shdr.sh_link - 1];
+ }
}
}