diff options
| author | 2018-06-18 09:15:05 +0000 | |
|---|---|---|
| committer | 2018-06-18 09:15:05 +0000 | |
| commit | cd6537e7223b2832188a5e0003b6f78cca96e374 (patch) | |
| tree | 14fb2d65d1512f7548535888ae6938b91fa7b695 /sys/kern/kern_exec.c | |
| parent | Talk about the common USE_LIBTOOL vs BUILD_DEPENDS case (ports that only (diff) | |
| download | wireguard-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/kern_exec.c')
| -rw-r--r-- | sys/kern/kern_exec.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index 9051cf4d054..7ccbab6a374 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_exec.c,v 1.197 2018/06/05 09:29:05 mpi Exp $ */ +/* $OpenBSD: kern_exec.c,v 1.198 2018/06/18 09:15:05 mpi Exp $ */ /* $NetBSD: kern_exec.c,v 1.75 1996/02/09 18:59:28 christos Exp $ */ /*- @@ -584,7 +584,7 @@ sys_execve(struct proc *p, void *v, register_t *retval) struct vnode *vp; int indx; - if ((error = falloc(p, 0, &fp, &indx)) != 0) + if ((error = falloc(p, &fp, &indx)) != 0) break; #ifdef DIAGNOSTIC if (indx != i) @@ -607,10 +607,9 @@ sys_execve(struct proc *p, void *v, register_t *retval) fp->f_type = DTYPE_VNODE; fp->f_ops = &vnops; fp->f_data = (caddr_t)vp; - FILE_SET_MATURE(fp, p); - } else { - FRELE(fp, p); + fdinsert(p->p_fd, indx, 0, fp); } + FRELE(fp, p); } fdpunlock(p->p_fd); if (error) |
