Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys Merge the kernel portion of the posix-spawn-chdir projec...
details: https://anonhg.NetBSD.org/src/rev/dd860370e24b
branches: trunk
changeset: 1024845:dd860370e24b
user: christos <christos%NetBSD.org@localhost>
date: Sun Nov 07 13:47:49 2021 +0000
description:
Merge the kernel portion of the posix-spawn-chdir project by Piyush Sachdeva.
diffstat:
sys/kern/kern_exec.c | 42 ++++++++++++++++++++++-------
sys/kern/vfs_syscalls.c | 69 ++++++++++++++++++++++++++++++------------------
sys/sys/spawn.h | 8 ++++-
sys/sys/vfs_syscalls.h | 4 ++-
4 files changed, 83 insertions(+), 40 deletions(-)
diffs (261 lines):
diff -r f03522adabd1 -r dd860370e24b sys/kern/kern_exec.c
--- a/sys/kern/kern_exec.c Sun Nov 07 13:43:11 2021 +0000
+++ b/sys/kern/kern_exec.c Sun Nov 07 13:47:49 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_exec.c,v 1.510 2021/10/10 18:07:51 thorpej Exp $ */
+/* $NetBSD: kern_exec.c,v 1.511 2021/11/07 13:47:49 christos Exp $ */
/*-
* Copyright (c) 2008, 2019, 2020 The NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.510 2021/10/10 18:07:51 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.511 2021/11/07 13:47:49 christos Exp $");
#include "opt_exec.h"
#include "opt_execfmt.h"
@@ -103,6 +103,7 @@
#include <sys/module.h>
#include <sys/syscallvar.h>
#include <sys/syscallargs.h>
+#include <sys/vfs_syscalls.h>
#if NVERIEXEC > 0
#include <sys/verified_exec.h>
#endif /* NVERIEXEC > 0 */
@@ -2132,6 +2133,13 @@
}
error = fd_close(fae->fae_fildes);
break;
+ case FAE_CHDIR:
+ error = do_sys_chdir(l, fae->fae_chdir_path,
+ UIO_SYSSPACE, &retval);
+ break;
+ case FAE_FCHDIR:
+ error = do_sys_fchdir(l, fae->fae_fildes, &retval);
+ break;
}
if (error)
return error;
@@ -2361,15 +2369,27 @@
exit1(l, 127, 0);
}
+static __inline char **
+posix_spawn_fae_path(struct posix_spawn_file_actions_entry *fae)
+{
+ switch (fae->fae_action) {
+ case FAE_OPEN:
+ return &fae->fae_path;
+ case FAE_CHDIR:
+ return &fae->fae_chdir_path;
+ default:
+ return NULL;
+ }
+}
+
void
posix_spawn_fa_free(struct posix_spawn_file_actions *fa, size_t len)
{
for (size_t i = 0; i < len; i++) {
- struct posix_spawn_file_actions_entry *fae = &fa->fae[i];
- if (fae->fae_action != FAE_OPEN)
- continue;
- kmem_strfree(fae->fae_path);
+ char **pathp = posix_spawn_fae_path(&fa->fae[i]);
+ if (pathp)
+ kmem_strfree(*pathp);
}
if (fa->len > 0)
kmem_free(fa->fae, sizeof(*fa->fae) * fa->len);
@@ -2408,14 +2428,14 @@
pbuf = PNBUF_GET();
for (; i < fa->len; i++) {
- fae = &fa->fae[i];
- if (fae->fae_action != FAE_OPEN)
+ char **pathp = posix_spawn_fae_path(&fa->fae[i]);
+ if (pathp == NULL)
continue;
- error = copyinstr(fae->fae_path, pbuf, MAXPATHLEN, &fal);
+ error = copyinstr(*pathp, pbuf, MAXPATHLEN, &fal);
if (error)
goto out;
- fae->fae_path = kmem_alloc(fal, KM_SLEEP);
- memcpy(fae->fae_path, pbuf, fal);
+ *pathp = kmem_alloc(fal, KM_SLEEP);
+ memcpy(*pathp, pbuf, fal);
}
PNBUF_PUT(pbuf);
diff -r f03522adabd1 -r dd860370e24b sys/kern/vfs_syscalls.c
--- a/sys/kern/vfs_syscalls.c Sun Nov 07 13:43:11 2021 +0000
+++ b/sys/kern/vfs_syscalls.c Sun Nov 07 13:47:49 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_syscalls.c,v 1.553 2021/09/26 21:29:38 thorpej Exp $ */
+/* $NetBSD: vfs_syscalls.c,v 1.554 2021/11/07 13:47:50 christos Exp $ */
/*-
* Copyright (c) 2008, 2009, 2019, 2020 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.553 2021/09/26 21:29:38 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.554 2021/11/07 13:47:50 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_fileassoc.h"
@@ -1459,24 +1459,19 @@
/*
* Change current working directory to a given file descriptor.
*/
-/* ARGSUSED */
int
-sys_fchdir(struct lwp *l, const struct sys_fchdir_args *uap, register_t *retval)
+do_sys_fchdir(struct lwp *l, int fd, register_t *retval)
{
- /* {
- syscallarg(int) fd;
- } */
struct proc *p = l->l_proc;
struct cwdinfo *cwdi;
struct vnode *vp, *tdp;
struct mount *mp;
file_t *fp;
- int error, fd;
+ int error;
/* fd_getvnode() will use the descriptor for us */
- fd = SCARG(uap, fd);
if ((error = fd_getvnode(fd, &fp)) != 0)
- return (error);
+ return error;
vp = fp->f_vnode;
vref(vp);
@@ -1517,9 +1512,22 @@
}
rw_exit(&cwdi->cwdi_lock);
- out:
+out:
fd_putfile(fd);
- return (error);
+ return error;
+}
+
+/*
+ * Change current working directory to a given file descriptor.
+ */
+/* ARGSUSED */
+int
+sys_fchdir(struct lwp *l, const struct sys_fchdir_args *uap, register_t *retval)
+{
+ /* {
+ syscallarg(int) fd;
+ } */
+ return do_sys_fchdir(l, SCARG(uap, fd), retval);
}
/*
@@ -1559,6 +1567,28 @@
/*
* Change current working directory (``.'').
*/
+int
+do_sys_chdir(struct lwp *l, const char *path, enum uio_seg seg,
+ register_t *retval)
+{
+ struct proc *p = l->l_proc;
+ struct cwdinfo * cwdi;
+ int error;
+ struct vnode *vp;
+
+ if ((error = chdir_lookup(path, seg, &vp, l)) != 0)
+ return error;
+ cwdi = p->p_cwdi;
+ rw_enter(&cwdi->cwdi_lock, RW_WRITER);
+ vrele(cwdi->cwdi_cdir);
+ cwdi->cwdi_cdir = vp;
+ rw_exit(&cwdi->cwdi_lock);
+ return 0;
+}
+
+/*
+ * Change current working directory (``.'').
+ */
/* ARGSUSED */
int
sys_chdir(struct lwp *l, const struct sys_chdir_args *uap, register_t *retval)
@@ -1566,20 +1596,7 @@
/* {
syscallarg(const char *) path;
} */
- struct proc *p = l->l_proc;
- struct cwdinfo *cwdi;
- int error;
- struct vnode *vp;
-
- if ((error = chdir_lookup(SCARG(uap, path), UIO_USERSPACE,
- &vp, l)) != 0)
- return (error);
- cwdi = p->p_cwdi;
- rw_enter(&cwdi->cwdi_lock, RW_WRITER);
- vrele(cwdi->cwdi_cdir);
- cwdi->cwdi_cdir = vp;
- rw_exit(&cwdi->cwdi_lock);
- return (0);
+ return do_sys_chdir(l, SCARG(uap, path), UIO_USERSPACE, retval);
}
/*
diff -r f03522adabd1 -r dd860370e24b sys/sys/spawn.h
--- a/sys/sys/spawn.h Sun Nov 07 13:43:11 2021 +0000
+++ b/sys/sys/spawn.h Sun Nov 07 13:47:49 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: spawn.h,v 1.6 2017/11/29 20:15:21 snj Exp $ */
+/* $NetBSD: spawn.h,v 1.7 2021/11/07 13:47:49 christos Exp $ */
/*-
* Copyright (c) 2008 Ed Schouten <ed%FreeBSD.org@localhost>
@@ -47,7 +47,7 @@
sigset_t sa_sigmask;
};
-enum fae_action { FAE_OPEN, FAE_DUP2, FAE_CLOSE };
+enum fae_action { FAE_OPEN, FAE_DUP2, FAE_CLOSE, FAE_CHDIR, FAE_FCHDIR };
typedef struct posix_spawn_file_actions_entry {
enum fae_action fae_action;
@@ -65,6 +65,10 @@
int newfildes;
#define fae_newfildes fae_data.dup2.newfildes
} dup2;
+ struct {
+ char *path;
+#define fae_chdir_path fae_data.chdir.path
+ } chdir;
} fae_data;
} posix_spawn_file_actions_entry_t;
diff -r f03522adabd1 -r dd860370e24b sys/sys/vfs_syscalls.h
--- a/sys/sys/vfs_syscalls.h Sun Nov 07 13:43:11 2021 +0000
+++ b/sys/sys/vfs_syscalls.h Sun Nov 07 13:47:49 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_syscalls.h,v 1.28 2020/04/20 21:39:05 ad Exp $ */
+/* $NetBSD: vfs_syscalls.h,v 1.29 2021/11/07 13:47:49 christos Exp $ */
/*
* Copyright (c) 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -80,6 +80,8 @@
int do_sys_symlink(const char *, const char *, enum uio_seg);
int do_sys_quotactl(const char *, const struct quotactl_args *);
void do_sys_sync(struct lwp *);
+int do_sys_chdir(struct lwp *, const char *, enum uio_seg, register_t *);
+int do_sys_fchdir(struct lwp *, int, register_t *);
int vfs_syncwait(void);
int chdir_lookup(const char *, int, struct vnode **, struct lwp *);
Home |
Main Index |
Thread Index |
Old Index