DragonFlyBSD Kernel Audit
DF-0061 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c
--- a/sys/kern/link_elf.c
+++ b/sys/kern/link_elf.c
@@ -715,6 +715,10 @@
     if (rel) {
 	rellim = (const Elf_Rel *)((const char *)ef->rel + ef->relsize);
 	while (rel < rellim) {
+	    if (rel->r_offset >= lf->size) {
+		rel++;
+		continue;
+	    }
 	    if (elf_reloc(lf, (Elf_Addr)ef->address, rel, ELF_RELOC_REL, elf_lookup)) {
 		symname = symbol_name(ef, rel->r_info);
 		kprintf("link_elf: symbol %s undefined\n", symname);
@@ -729,6 +733,10 @@
     if (rela) {
 	relalim = (const Elf_Rela *)((const char *)ef->rela + ef->relasize);
 	while (rela < relalim) {
+	    if (rela->r_offset >= lf->size) {
+		rela++;
+		continue;
+	    }
 	    if (elf_reloc(lf, (Elf_Addr)ef->address, rela, ELF_RELOC_RELA, elf_lookup)) {
 		symname = symbol_name(ef, rela->r_info);
 		kprintf("link_elf: symbol %s undefined\n", symname);