summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mld/link.c4
-rw-r--r--mld/seg.c5
-rw-r--r--mld/segtab.c2
3 files changed, 11 insertions, 0 deletions
diff --git a/mld/link.c b/mld/link.c
index de703c2..5696973 100644
--- a/mld/link.c
+++ b/mld/link.c
@@ -399,6 +399,10 @@ static int relocate_instruction_rela(struct linker *linker,
/// get the segment that the symbol is in
struct segment_table_entry *ent;
const char *segname = seg->obj->shstrtab->data + B32(shdr->sh_name);
+ if (B32(shdr->sh_name) >= seg->obj->shstrtab->len) {
+ ERROR("relocation segment name out of bounds");
+ return M_ERROR;
+ }
if (segtab_get(&linker->segments, &ent, segname)) {
ERROR("could not locate segment for relocation");
return M_ERROR;
diff --git a/mld/seg.c b/mld/seg.c
index 23cf062..ba14cf9 100644
--- a/mld/seg.c
+++ b/mld/seg.c
@@ -43,6 +43,11 @@ static int load_shdr(struct object *obj, struct segment *seg, size_t index)
}
seg->name = &obj->shstrtab->data[name];
+ if (seg->phdr->p_filesz != hdr->sh_size) {
+ ERROR("segment phdr and shdr file sizes to not match");
+ return M_ERROR;
+ }
+
// map bytes
uint32_t len = B32(hdr->sh_size);
uint32_t off = B32(hdr->sh_offset);
diff --git a/mld/segtab.c b/mld/segtab.c
index 22356d5..d62b9a8 100644
--- a/mld/segtab.c
+++ b/mld/segtab.c
@@ -121,12 +121,14 @@ int segtab_ent_push(struct segment_table_entry *ent, struct segment *seg)
if (first->align != seg->align) {
ERROR("segment '%s' doest not have matching alignment",
ent->name);
+ return M_ERROR;
}
if (first->read != seg->read ||
first->write != seg->write ||
first->execute != seg->execute) {
ERROR("segment '%s' doest not have matching RWX",
ent->name);
+ return M_ERROR;
}
} else {
ent->off = seg->new_off;