MFP4: 114193, 114194
Dont "return" in linux_clone() after we forked the new process in a case of problems. Move the copyout of p2->p_pid outside the emul_lock coverage. Submitted by: Roman Divacky
This commit is contained in:
parent
e77a8f9d7d
commit
5e397f16cd
@ -593,6 +593,10 @@ linux_clone(struct thread *td, struct linux_clone_args *args)
|
|||||||
if ((args->flags & 0xffffff00) == LINUX_THREADING_FLAGS)
|
if ((args->flags & 0xffffff00) == LINUX_THREADING_FLAGS)
|
||||||
ff |= RFTHREAD;
|
ff |= RFTHREAD;
|
||||||
|
|
||||||
|
if (args->flags & LINUX_CLONE_PARENT_SETTID)
|
||||||
|
if (args->parent_tidptr == NULL)
|
||||||
|
return (EINVAL);
|
||||||
|
|
||||||
error = fork1(td, ff, 0, &p2);
|
error = fork1(td, ff, 0, &p2);
|
||||||
if (error)
|
if (error)
|
||||||
return (error);
|
return (error);
|
||||||
@ -611,17 +615,6 @@ linux_clone(struct thread *td, struct linux_clone_args *args)
|
|||||||
em = em_find(p2, EMUL_DOLOCK);
|
em = em_find(p2, EMUL_DOLOCK);
|
||||||
KASSERT(em != NULL, ("clone: emuldata not found.\n"));
|
KASSERT(em != NULL, ("clone: emuldata not found.\n"));
|
||||||
/* and adjust it */
|
/* and adjust it */
|
||||||
if (args->flags & LINUX_CLONE_PARENT_SETTID) {
|
|
||||||
if (args->parent_tidptr == NULL) {
|
|
||||||
EMUL_UNLOCK(&emul_lock);
|
|
||||||
return (EINVAL);
|
|
||||||
}
|
|
||||||
error = copyout(&p2->p_pid, args->parent_tidptr, sizeof(p2->p_pid));
|
|
||||||
if (error) {
|
|
||||||
EMUL_UNLOCK(&emul_lock);
|
|
||||||
return (error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args->flags & LINUX_CLONE_THREAD) {
|
if (args->flags & LINUX_CLONE_THREAD) {
|
||||||
/* XXX: linux mangles pgrp and pptr somehow
|
/* XXX: linux mangles pgrp and pptr somehow
|
||||||
@ -647,6 +640,13 @@ linux_clone(struct thread *td, struct linux_clone_args *args)
|
|||||||
|
|
||||||
EMUL_UNLOCK(&emul_lock);
|
EMUL_UNLOCK(&emul_lock);
|
||||||
|
|
||||||
|
if (args->flags & LINUX_CLONE_PARENT_SETTID) {
|
||||||
|
error = copyout(&p2->p_pid, args->parent_tidptr,
|
||||||
|
sizeof(p2->p_pid));
|
||||||
|
if (error)
|
||||||
|
printf(LMSG("copyout failed!"));
|
||||||
|
}
|
||||||
|
|
||||||
PROC_LOCK(p2);
|
PROC_LOCK(p2);
|
||||||
p2->p_sigparent = exit_signal;
|
p2->p_sigparent = exit_signal;
|
||||||
PROC_UNLOCK(p2);
|
PROC_UNLOCK(p2);
|
||||||
|
Loading…
Reference in New Issue
Block a user