Page MenuHomeFreeBSD

D26525.id77376.diff
No OneTemporary

D26525.id77376.diff

Index: sys/compat/cloudabi/cloudabi_proc.c
===================================================================
--- sys/compat/cloudabi/cloudabi_proc.c
+++ sys/compat/cloudabi/cloudabi_proc.c
@@ -57,7 +57,7 @@
uap->fds, uap->fds_len);
if (error == 0) {
args.fd = uap->fd;
- error = kern_execve(td, &args, NULL);
+ error = kern_execve(td, &args, NULL, oldvmspace);
}
post_execve(td, error, oldvmspace);
return (error);
Index: sys/compat/freebsd32/freebsd32_misc.c
===================================================================
--- sys/compat/freebsd32/freebsd32_misc.c
+++ sys/compat/freebsd32/freebsd32_misc.c
@@ -440,7 +440,7 @@
error = freebsd32_exec_copyin_args(&eargs, uap->fname, UIO_USERSPACE,
uap->argv, uap->envv);
if (error == 0)
- error = kern_execve(td, &eargs, NULL);
+ error = kern_execve(td, &eargs, NULL, oldvmspace);
post_execve(td, error, oldvmspace);
return (error);
}
@@ -459,7 +459,7 @@
uap->argv, uap->envv);
if (error == 0) {
eargs.fd = uap->fd;
- error = kern_execve(td, &eargs, NULL);
+ error = kern_execve(td, &eargs, NULL, oldvmspace);
}
post_execve(td, error, oldvmspace);
return (error);
Index: sys/compat/linux/linux_emul.c
===================================================================
--- sys/compat/linux/linux_emul.c
+++ sys/compat/linux/linux_emul.c
@@ -256,7 +256,7 @@
if (error != 0)
return (error);
- error = kern_execve(td, eargs, NULL);
+ error = kern_execve(td, eargs, NULL, oldvmspace);
post_execve(td, error, oldvmspace);
if (error != EJUSTRETURN)
return (error);
Index: sys/kern/init_main.c
===================================================================
--- sys/kern/init_main.c
+++ sys/kern/init_main.c
@@ -752,16 +752,11 @@
KASSERT((td->td_pflags & TDP_EXECVMSPC) == 0,
("nested execve"));
oldvmspace = td->td_proc->p_vmspace;
- error = kern_execve(td, &args, NULL);
+ error = kern_execve(td, &args, NULL, oldvmspace);
KASSERT(error != 0,
("kern_execve returned success, not EJUSTRETURN"));
if (error == EJUSTRETURN) {
- if ((td->td_pflags & TDP_EXECVMSPC) != 0) {
- KASSERT(p->p_vmspace != oldvmspace,
- ("oldvmspace still used"));
- vmspace_free(oldvmspace);
- td->td_pflags &= ~TDP_EXECVMSPC;
- }
+ exec_cleanup(td, false, oldvmspace);
free(free_init_path, M_TEMP);
TSEXIT();
return;
Index: sys/kern/kern_exec.c
===================================================================
--- sys/kern/kern_exec.c
+++ sys/kern/kern_exec.c
@@ -118,7 +118,7 @@
static int sysctl_kern_usrstack(SYSCTL_HANDLER_ARGS);
static int sysctl_kern_stackprot(SYSCTL_HANDLER_ARGS);
static int do_execve(struct thread *td, struct image_args *args,
- struct mac *mac_p);
+ struct mac *mac_p, struct vmspace *oldvmspace);
/* XXX This should be vm_size_t. */
SYSCTL_PROC(_kern, KERN_PS_STRINGS, ps_strings, CTLTYPE_ULONG|CTLFLAG_RD|
@@ -223,7 +223,7 @@
error = exec_copyin_args(&args, uap->fname, UIO_USERSPACE,
uap->argv, uap->envv);
if (error == 0)
- error = kern_execve(td, &args, NULL);
+ error = kern_execve(td, &args, NULL, oldvmspace);
post_execve(td, error, oldvmspace);
return (error);
}
@@ -249,7 +249,7 @@
uap->argv, uap->envv);
if (error == 0) {
args.fd = uap->fd;
- error = kern_execve(td, &args, NULL);
+ error = kern_execve(td, &args, NULL, oldvmspace);
}
post_execve(td, error, oldvmspace);
return (error);
@@ -278,7 +278,7 @@
error = exec_copyin_args(&args, uap->fname, UIO_USERSPACE,
uap->argv, uap->envv);
if (error == 0)
- error = kern_execve(td, &args, uap->mac_p);
+ error = kern_execve(td, &args, uap->mac_p, oldvmspace);
post_execve(td, error, oldvmspace);
return (error);
#else
@@ -335,21 +335,22 @@
}
/*
- * XXX: kern_execve has the astonishing property of not always returning to
+ * kern_execve() has the astonishing property of not always returning to
* the caller. If sufficiently bad things happen during the call to
* do_execve(), it can end up calling exit1(); as a result, callers must
* avoid doing anything which they might need to undo (e.g., allocating
* memory).
*/
int
-kern_execve(struct thread *td, struct image_args *args, struct mac *mac_p)
+kern_execve(struct thread *td, struct image_args *args, struct mac *mac_p,
+ struct vmspace *oldvmspace)
{
AUDIT_ARG_ARGV(args->begin_argv, args->argc,
exec_args_get_begin_envv(args) - args->begin_argv);
AUDIT_ARG_ENVV(exec_args_get_begin_envv(args), args->envc,
args->endp - exec_args_get_begin_envv(args));
- return (do_execve(td, args, mac_p));
+ return (do_execve(td, args, mac_p, oldvmspace));
}
/*
@@ -357,7 +358,8 @@
* userspace pointers from the passed thread.
*/
static int
-do_execve(struct thread *td, struct image_args *args, struct mac *mac_p)
+do_execve(struct thread *td, struct image_args *args, struct mac *mac_p,
+ struct vmspace *oldvmspace)
{
struct proc *p = td->td_proc;
struct nameidata nd;
@@ -949,6 +951,7 @@
if (error && imgp->vmspace_destroyed) {
/* sorry, no more process anymore. exit gracefully */
+ exec_cleanup(td, true, oldvmspace);
exit1(td, 0, SIGABRT);
/* NOT REACHED */
}
@@ -967,6 +970,25 @@
return (error == 0 ? EJUSTRETURN : error);
}
+void
+exec_cleanup(struct thread *td, bool failure, struct vmspace *oldvmspace)
+{
+ struct proc *p;
+
+ p = td->td_proc;
+ if (failure && (p->p_flag & P_HADTHREADS) != 0) {
+ PROC_LOCK(p);
+ thread_single(p, SINGLE_EXIT);
+ PROC_UNLOCK(p);
+ }
+ if ((td->td_pflags & TDP_EXECVMSPC) != 0) {
+ KASSERT(p->p_vmspace != oldvmspace,
+ ("oldvmspace still used"));
+ vmspace_free(oldvmspace);
+ td->td_pflags &= ~TDP_EXECVMSPC;
+ }
+}
+
int
exec_map_first_page(struct image_params *imgp)
{
Index: sys/sys/imgact.h
===================================================================
--- sys/sys/imgact.h
+++ sys/sys/imgact.h
@@ -112,6 +112,7 @@
ssize_t extend);
char *exec_args_get_begin_envv(struct image_args *args);
int exec_check_permissions(struct image_params *);
+void exec_cleanup(struct thread *td, bool, struct vmspace *);
int exec_copyout_strings(struct image_params *, uintptr_t *);
void exec_free_args(struct image_args *);
int exec_new_vmspace(struct image_params *, struct sysentvec *);
Index: sys/sys/syscallsubr.h
===================================================================
--- sys/sys/syscallsubr.h
+++ sys/sys/syscallsubr.h
@@ -63,6 +63,7 @@
struct thr_param;
struct uio;
struct vm_map;
+struct vmspace;
typedef int (*mmap_check_fp_fn)(struct file *, int, int, int);
@@ -129,7 +130,7 @@
id_t id, cpusetid_t setid);
int kern_dup(struct thread *td, u_int mode, int flags, int old, int new);
int kern_execve(struct thread *td, struct image_args *args,
- struct mac *mac_p);
+ struct mac *mac_p, struct vmspace *oldvmspace);
int kern_fchmodat(struct thread *td, int fd, const char *path,
enum uio_seg pathseg, mode_t mode, int flag);
int kern_fchownat(struct thread *td, int fd, const char *path,

File Metadata

Mime Type
text/plain
Expires
Wed, May 20, 5:26 PM (17 h, 10 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33352478
Default Alt Text
D26525.id77376.diff (6 KB)

Event Timeline