Module Name: src
Committed By: martin
Date: Thu Nov 11 17:32:46 UTC 2021
Modified Files:
src/sys/compat/netbsd32: netbsd32.h netbsd32_execve.c
Log Message:
Adapt to recent posix_spawn extensions.
To generate a diff of this commit:
cvs rdiff -u -r1.138 -r1.139 src/sys/compat/netbsd32/netbsd32.h
cvs rdiff -u -r1.43 -r1.44 src/sys/compat/netbsd32/netbsd32_execve.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/compat/netbsd32/netbsd32.h
diff -u src/sys/compat/netbsd32/netbsd32.h:1.138 src/sys/compat/netbsd32/netbsd32.h:1.139
--- src/sys/compat/netbsd32/netbsd32.h:1.138 Sat Nov 6 20:42:56 2021
+++ src/sys/compat/netbsd32/netbsd32.h Thu Nov 11 17:32:46 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32.h,v 1.138 2021/11/06 20:42:56 thorpej Exp $ */
+/* $NetBSD: netbsd32.h,v 1.139 2021/11/11 17:32:46 martin Exp $ */
/*
* Copyright (c) 1998, 2001, 2008, 2015 Matthew R. Green
@@ -1152,7 +1152,8 @@ struct netbsd32_null_args {
};
struct netbsd32_posix_spawn_file_actions_entry {
- enum { FAE32_OPEN, FAE32_DUP2, FAE32_CLOSE } fae_action;
+ enum { FAE32_OPEN, FAE32_DUP2, FAE32_CLOSE,
+ FAE32_CHDIR, FAE32_FCHDIR } fae_action;
int fae_fildes;
union {
@@ -1164,6 +1165,9 @@ struct netbsd32_posix_spawn_file_actions
struct {
int newfildes;
} dup2;
+ struct {
+ netbsd32_charp path;
+ } chdir;
} fae_data;
};
Index: src/sys/compat/netbsd32/netbsd32_execve.c
diff -u src/sys/compat/netbsd32/netbsd32_execve.c:1.43 src/sys/compat/netbsd32/netbsd32_execve.c:1.44
--- src/sys/compat/netbsd32/netbsd32_execve.c:1.43 Tue Apr 13 05:28:16 2021
+++ src/sys/compat/netbsd32/netbsd32_execve.c Thu Nov 11 17:32:46 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_execve.c,v 1.43 2021/04/13 05:28:16 mrg Exp $ */
+/* $NetBSD: netbsd32_execve.c,v 1.44 2021/11/11 17:32:46 martin Exp $ */
/*
* Copyright (c) 1998, 2001 Matthew R. Green
@@ -28,7 +28,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_execve.c,v 1.43 2021/04/13 05:28:16 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_execve.c,v 1.44 2021/11/11 17:32:46 martin Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -90,6 +90,26 @@ netbsd32_fexecve(struct lwp *l, const st
SCARG_P32(uap, envp), netbsd32_execve_fetch_element);
}
+static __inline bool
+netbsd32_posix_spawn_fae_path(
+ struct posix_spawn_file_actions_entry *fae,
+ struct netbsd32_posix_spawn_file_actions_entry *fae32,
+ char ***pathp, char **pathp32)
+{
+ switch (fae->fae_action) {
+ case FAE_OPEN:
+ *pathp = &fae->fae_path;
+ *pathp32 = NETBSD32PTR64(fae32->fae_data.open.path);
+ return true;
+ case FAE_CHDIR:
+ *pathp = &fae->fae_chdir_path;
+ *pathp32 = NETBSD32PTR64(fae32->fae_data.chdir.path);
+ return true;
+ default:
+ return false;
+ }
+}
+
static int
netbsd32_posix_spawn_fa_alloc(struct posix_spawn_file_actions **fap,
const struct netbsd32_posix_spawn_file_actions *ufa, rlim_t lim)
@@ -98,7 +118,7 @@ netbsd32_posix_spawn_fa_alloc(struct pos
struct netbsd32_posix_spawn_file_actions fa32;
struct netbsd32_posix_spawn_file_actions_entry *fae32 = NULL, *f32 = NULL;
struct posix_spawn_file_actions_entry *fae;
- char *pbuf = NULL;
+ char *pbuf = NULL, **pathp = NULL, *pathp32 = NULL;
int error;
size_t fal, fal32, slen, i = 0;
@@ -135,26 +155,24 @@ netbsd32_posix_spawn_fa_alloc(struct pos
if (fae->fae_action == FAE_DUP2)
fae->fae_data.dup2.newfildes =
f32->fae_data.dup2.newfildes;
- if (fae->fae_action != FAE_OPEN)
+ if (!netbsd32_posix_spawn_fae_path(fae, f32, &pathp, &pathp32)
+ || pathp == NULL || pathp32 == NULL)
continue;
- error = copyinstr(NETBSD32PTR64(f32->fae_path), pbuf,
- MAXPATHLEN, &slen);
+ error = copyinstr(pathp32, pbuf, MAXPATHLEN, &slen);
if (error)
goto out;
- fae->fae_path = kmem_alloc(slen, KM_SLEEP);
- memcpy(fae->fae_path, pbuf, slen);
+ *pathp = kmem_alloc(slen, KM_SLEEP);
+ memcpy(*pathp, pbuf, slen);
fae->fae_oflag = f32->fae_oflag;
fae->fae_mode = f32->fae_mode;
}
PNBUF_PUT(pbuf);
- if (fae32)
- kmem_free(fae32, fal32);
+ kmem_free(fae32, fal32);
*fap = fa;
return 0;
out:
- if (fae32)
- kmem_free(fae32, fal32);
+ kmem_free(fae32, fal32);
if (pbuf)
PNBUF_PUT(pbuf);
posix_spawn_fa_free(fa, i);