patches for easier mirroring, to eliminate a special copy, to make www.freebsd.org/security a full copy of security.freebsd.org and be eventually be the same. For now files are just sitting there. The symlinks are missing. Discussed on: www (repository location) Discussed with: simon (so)
65 lines
1.8 KiB
Diff
65 lines
1.8 KiB
Diff
--- imgact_elf.c 2000/04/30 18:51:39 1.75
|
|
+++ imgact_elf.c 2000/07/23 22:19:49 1.78
|
|
@@ -190,6 +190,21 @@
|
|
object = vp->v_object;
|
|
error = 0;
|
|
|
|
+ /*
|
|
+ * It's necessary to fail if the filsz + offset taken from the
|
|
+ * header is greater than the actual file pager object's size.
|
|
+ * If we were to allow this, then the vm_map_find() below would
|
|
+ * walk right off the end of the file object and into the ether.
|
|
+ *
|
|
+ * While I'm here, might as well check for something else that
|
|
+ * is invalid: filsz cannot be greater than memsz.
|
|
+ */
|
|
+ if ((off_t)filsz + offset > object->un_pager.vnp.vnp_size ||
|
|
+ filsz > memsz) {
|
|
+ uprintf("elf_load_section: truncated ELF file\n");
|
|
+ return (ENOEXEC);
|
|
+ }
|
|
+
|
|
map_addr = trunc_page((vm_offset_t)vmaddr);
|
|
file_addr = trunc_page(offset);
|
|
|
|
@@ -341,6 +356,12 @@
|
|
}
|
|
|
|
error = exec_map_first_page(imgp);
|
|
+ /*
|
|
+ * Also make certain that the interpreter stays the same, so set
|
|
+ * its VTEXT flag, too.
|
|
+ */
|
|
+ if (error == 0)
|
|
+ nd.ni_vp->v_flag |= VTEXT;
|
|
VOP_UNLOCK(nd.ni_vp, 0, p);
|
|
if (error)
|
|
goto fail;
|
|
@@ -449,6 +470,17 @@
|
|
/*
|
|
* From this point on, we may have resources that need to be freed.
|
|
*/
|
|
+
|
|
+ /*
|
|
+ * Yeah, I'm paranoid. There is every reason in the world to get
|
|
+ * VTEXT now since from here on out, there are places we can have
|
|
+ * a context switch. Better safe than sorry; I really don't want
|
|
+ * the file to change while it's being loaded.
|
|
+ */
|
|
+ simple_lock(&imgp->vp->v_interlock);
|
|
+ imgp->vp->v_flag |= VTEXT;
|
|
+ simple_unlock(&imgp->vp->v_interlock);
|
|
+
|
|
if ((error = exec_extract_strings(imgp)) != 0)
|
|
goto fail;
|
|
|
|
@@ -610,9 +642,6 @@
|
|
imgp->auxargs = elf_auxargs;
|
|
imgp->interpreted = 0;
|
|
|
|
- /* don't allow modifying the file while we run it */
|
|
- imgp->vp->v_flag |= VTEXT;
|
|
-
|
|
fail:
|
|
return error;
|
|
}
|