summaryrefslogtreecommitdiffstats
path: root/sys/kern/exec_script.c
diff options
context:
space:
mode:
authormpi <mpi@openbsd.org>2018-06-18 09:15:05 +0000
committermpi <mpi@openbsd.org>2018-06-18 09:15:05 +0000
commitcd6537e7223b2832188a5e0003b6f78cca96e374 (patch)
tree14fb2d65d1512f7548535888ae6938b91fa7b695 /sys/kern/exec_script.c
parentTalk about the common USE_LIBTOOL vs BUILD_DEPENDS case (ports that only (diff)
downloadwireguard-openbsd-cd6537e7223b2832188a5e0003b6f78cca96e374.tar.xz
wireguard-openbsd-cd6537e7223b2832188a5e0003b6f78cca96e374.zip
Put file descriptors on shared data structures when they are completely
setup, take 3. LARVAL fd still exist, but they are no longer marked with a flag and no longer reachable via `fd_ofiles[]' or the global linked list. This allows us to simplifies a lot code grabbing new references to fds. All of this is now possible because dup2(2) refuses to clone LARVAL fds. Note that the `fdplock' could now be release in all open(2)-like syscalls, just like it is done in accept(2). With inputs from Mathieu Masson, visa@, guenther@ and art@ Previous version ok bluhm@, ok visa@, sthen@
Diffstat (limited to 'sys/kern/exec_script.c')
-rw-r--r--sys/kern/exec_script.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/sys/kern/exec_script.c b/sys/kern/exec_script.c
index d6ac23ba26f..788260254f5 100644
--- a/sys/kern/exec_script.c
+++ b/sys/kern/exec_script.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: exec_script.c,v 1.46 2018/06/05 09:29:05 mpi Exp $ */
+/* $OpenBSD: exec_script.c,v 1.47 2018/06/18 09:15:05 mpi Exp $ */
/* $NetBSD: exec_script.c,v 1.13 1996/02/04 02:15:06 christos Exp $ */
/*
@@ -170,17 +170,20 @@ check_shell:
#endif
fdplock(p->p_fd);
- error = falloc(p, 0, &fp, &epp->ep_fd);
- fdpunlock(p->p_fd);
- if (error)
+ error = falloc(p, &fp, &epp->ep_fd);
+ if (error) {
+ fdpunlock(p->p_fd);
goto fail;
+ }
epp->ep_flags |= EXEC_HASFD;
fp->f_type = DTYPE_VNODE;
fp->f_ops = &vnops;
fp->f_data = (caddr_t) scriptvp;
fp->f_flag = FREAD;
- FILE_SET_MATURE(fp, p);
+ fdinsert(p->p_fd, epp->ep_fd, 0, fp);
+ fdpunlock(p->p_fd);
+ FRELE(fp, p);
}
/* set up the parameters for the recursive check_exec() call */