Path: blob/main/website/static/security/patches/EN-14:06/exec-9.patch
18096 views
Index: sys/kern/kern_exec.c1===================================================================2--- sys/kern/kern_exec.c (revision 266584)3+++ sys/kern/kern_exec.c (revision 266585)4@@ -282,6 +282,7 @@ kern_execve(td, args, mac_p)5struct mac *mac_p;6{7struct proc *p = td->td_proc;8+ struct vmspace *oldvmspace;9int error;1011AUDIT_ARG_ARGV(args->begin_argv, args->argc,12@@ -298,6 +299,8 @@ kern_execve(td, args, mac_p)13PROC_UNLOCK(p);14}1516+ KASSERT((td->td_pflags & TDP_EXECVMSPC) == 0, ("nested execve"));17+ oldvmspace = td->td_proc->p_vmspace;18error = do_execve(td, args, mac_p);1920if (p->p_flag & P_HADTHREADS) {21@@ -312,6 +315,12 @@ kern_execve(td, args, mac_p)22thread_single_end();23PROC_UNLOCK(p);24}25+ if ((td->td_pflags & TDP_EXECVMSPC) != 0) {26+ KASSERT(td->td_proc->p_vmspace != oldvmspace,27+ ("oldvmspace still used"));28+ vmspace_free(oldvmspace);29+ td->td_pflags &= ~TDP_EXECVMSPC;30+ }3132return (error);33}34Index: sys/sys/proc.h35===================================================================36--- sys/sys/proc.h (revision 266584)37+++ sys/sys/proc.h (revision 266585)38@@ -426,6 +426,7 @@ do { \39#define TDP_NERRNO 0x08000000 /* Last errno is already in td_errno */40#define TDP_UIOHELD 0x10000000 /* Current uio has pages held in td_ma */41#define TDP_DEVMEMIO 0x20000000 /* Accessing memory for /dev/mem */42+#define TDP_EXECVMSPC 0x40000000 /* Execve destroyed old vmspace */4344/*45* Reasons that the current thread can not be run yet.46Index: sys/sys47===================================================================48--- sys/sys (revision 266584)49+++ sys/sys (revision 266585)5051Property changes on: sys/sys52___________________________________________________________________53Modified: svn:mergeinfo54Merged /head/sys/sys:r26646455Index: sys/vm/vm_map.c56===================================================================57--- sys/vm/vm_map.c (revision 266584)58+++ sys/vm/vm_map.c (revision 266585)59@@ -3752,6 +3752,8 @@ vmspace_exec(struct proc *p, vm_offset_t minuser,60struct vmspace *oldvmspace = p->p_vmspace;61struct vmspace *newvmspace;6263+ KASSERT((curthread->td_pflags & TDP_EXECVMSPC) == 0,64+ ("vmspace_exec recursed"));65newvmspace = vmspace_alloc(minuser, maxuser);66if (newvmspace == NULL)67return (ENOMEM);68@@ -3768,7 +3770,7 @@ vmspace_exec(struct proc *p, vm_offset_t minuser,69PROC_VMSPACE_UNLOCK(p);70if (p == curthread->td_proc)71pmap_activate(curthread);72- vmspace_free(oldvmspace);73+ curthread->td_pflags |= TDP_EXECVMSPC;74return (0);75}7677Index: sys78===================================================================79--- sys (revision 266584)80+++ sys (revision 266585)8182Property changes on: sys83___________________________________________________________________84Modified: svn:mergeinfo85Merged /head/sys:r266464868788