From 84e0b075f6877ea4b0103912632bae4daa85bac5 Mon Sep 17 00:00:00 2001 From: David Xu Date: Thu, 7 Oct 2004 13:50:10 +0000 Subject: [PATCH] Add an execve command for kse_thr_interrupt to allow libpthread to restore signal mask correctly, this is required by POSIX. Reviewed by: deischen --- sys/kern/kern_exec.c | 5 ++--- sys/kern/kern_kse.c | 17 +++++++++++++++++ sys/sys/kse.h | 10 ++++++++++ sys/sys/syscallsubr.h | 3 +++ 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index 47b3a3399774..d23683207999 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -78,8 +79,6 @@ MALLOC_DEFINE(M_PARGS, "proc-args", "Process arguments"); static int sysctl_kern_ps_strings(SYSCTL_HANDLER_ARGS); static int sysctl_kern_usrstack(SYSCTL_HANDLER_ARGS); static int sysctl_kern_stackprot(SYSCTL_HANDLER_ARGS); -static int kern_execve(struct thread *td, char *fname, char **argv, - char **envv, struct mac *mac_p); static int do_execve(struct thread *td, char *fname, char **argv, char **envv, struct mac *mac_p); @@ -207,7 +206,7 @@ __mac_execve(td, uap) #endif } -static int +int kern_execve(td, fname, argv, envv, mac_p) struct thread *td; char *fname; diff --git a/sys/kern/kern_kse.c b/sys/kern/kern_kse.c index eff18d170c62..5a98f82cf61b 100644 --- a/sys/kern/kern_kse.c +++ b/sys/kern/kern_kse.c @@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -176,11 +177,13 @@ struct kse_thr_interrupt_args { int kse_thr_interrupt(struct thread *td, struct kse_thr_interrupt_args *uap) { + struct kse_execve_args args; struct proc *p; struct thread *td2; struct kse_upcall *ku; struct kse_thr_mailbox *tmbx; uint32_t flags; + int error; p = td->td_proc; @@ -256,6 +259,20 @@ kse_thr_interrupt(struct thread *td, struct kse_thr_interrupt_args *uap) } return (0); + case KSE_INTR_EXECVE: + error = copyin((void *)uap->data, &args, sizeof(args)); + if (error) + return (error); + error = kern_execve(td, args.path, args.argv, args.envp, NULL); + if (error == 0) { + PROC_LOCK(p); + SIGSETOR(td->td_siglist, args.sigpend); + PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_SETMASK, &args.sigmask, NULL, + 0); + } + return (error); + default: return (EINVAL); } diff --git a/sys/sys/kse.h b/sys/sys/kse.h index 2de3d95984a6..1f3f3989be74 100644 --- a/sys/sys/kse.h +++ b/sys/sys/kse.h @@ -112,6 +112,16 @@ struct kse_mailbox { #define KSE_INTR_SENDSIG 3 #define KSE_INTR_SIGEXIT 4 #define KSE_INTR_DBSUSPEND 5 +#define KSE_INTR_EXECVE 6 + +struct kse_execve_args { + sigset_t sigmask; + sigset_t sigpend; + char *path; + char **argv; + char **envp; + void *reserved; +}; #ifndef _KERNEL int kse_create(struct kse_mailbox *, int); diff --git a/sys/sys/syscallsubr.h b/sys/sys/syscallsubr.h index 02fc20a5c89b..c583e086d1d7 100644 --- a/sys/sys/syscallsubr.h +++ b/sys/sys/syscallsubr.h @@ -31,6 +31,7 @@ #include #include #include +#include struct mbuf; struct msghdr; @@ -98,6 +99,8 @@ int kern_truncate(struct thread *td, char *path, enum uio_seg pathseg, int kern_unlink(struct thread *td, char *path, enum uio_seg pathseg); int kern_utimes(struct thread *td, char *path, enum uio_seg pathseg, struct timeval *tptr, enum uio_seg tptrseg); +int kern_execve(struct thread *td, char *fname, char **argv, char **envv, + struct mac *mac_p); /* flags for kern_sigaction */ #define KSA_OSIGSET 0x0001 /* uses osigact_t */