When I merged the lemul branch I missied kib@'s r282708 commit.

This is not the final fix as I need properly cleanup thread resources
before other threads suicide.

Tested by:	Ruslan Makhmatkhanov
This commit is contained in:
dchagin 2015-05-25 20:44:46 +00:00
parent fe042f46ba
commit 50f49b7240
3 changed files with 5 additions and 31 deletions

View File

@ -126,7 +126,6 @@ int
linux_execve(struct thread *td, struct linux_execve_args *args)
{
struct image_args eargs;
struct vmspace *oldvmspace;
char *path;
int error;
@ -137,19 +136,11 @@ linux_execve(struct thread *td, struct linux_execve_args *args)
printf(ARGS(execve, "%s"), path);
#endif
error = pre_execve(td, &oldvmspace);
if (error != 0) {
free(path, M_TEMP);
return (error);
}
error = freebsd32_exec_copyin_args(&eargs, path, UIO_SYSSPACE,
args->argp, args->envp);
free(path, M_TEMP);
if (error == 0)
error = kern_execve(td, &eargs, NULL);
if (error == 0)
error = linux_common_execve(td, &eargs);
post_execve(td, error, oldvmspace);
return (error);
}

View File

@ -172,27 +172,19 @@ linux_common_execve(struct thread *td, struct image_args *eargs)
{
struct linux_pemuldata *pem;
struct epoll_emuldata *emd;
struct vmspace *oldvmspace;
struct linux_emuldata *em;
struct proc *p;
int error;
p = td->td_proc;
/*
* Unlike FreeBSD abort all other threads before
* proceeding exec.
*/
PROC_LOCK(p);
/* See exit1() comments. */
thread_suspend_check(0);
while (p->p_flag & P_HADTHREADS) {
if (!thread_single(p, SINGLE_EXIT))
break;
thread_suspend_check(0);
}
PROC_UNLOCK(p);
error = pre_execve(td, &oldvmspace);
if (error != 0)
return (error);
error = kern_execve(td, eargs, NULL);
post_execve(td, error, oldvmspace);
if (error != 0)
return (error);

View File

@ -104,7 +104,6 @@ int
linux_execve(struct thread *td, struct linux_execve_args *args)
{
struct image_args eargs;
struct vmspace *oldvmspace;
char *newpath;
int error;
@ -115,19 +114,11 @@ linux_execve(struct thread *td, struct linux_execve_args *args)
printf(ARGS(execve, "%s"), newpath);
#endif
error = pre_execve(td, &oldvmspace);
if (error != 0) {
free(newpath, M_TEMP);
return (error);
}
error = exec_copyin_args(&eargs, newpath, UIO_SYSSPACE,
args->argp, args->envp);
free(newpath, M_TEMP);
if (error == 0)
error = kern_execve(td, &eargs, NULL);
if (error == 0)
error = linux_common_execve(td, &eargs);
post_execve(td, error, oldvmspace);
return (error);
}