From bf39d3283bbc83773459ae5d399ead2bf4452fb7 Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Sun, 22 Sep 2024 16:44:54 -0400 Subject: [PATCH] fix mem errors --- mld/link.c | 4 ++++ mld/seg.c | 5 +++++ mld/segtab.c | 2 ++ 3 files changed, 11 insertions(+) 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;