Add an envp argument to proc_create().

This is needed to support dtrace's -x setenv option.

MFC after:	2 weeks
This commit is contained in:
Mark Johnston 2017-12-03 16:50:16 +00:00
parent 4fbebc7472
commit 5577b8a709
6 changed files with 21 additions and 18 deletions

View File

@ -38,6 +38,9 @@
# xargs -n1 | sort | uniq -d; # xargs -n1 | sort | uniq -d;
# done # done
# 20171203: libproc version bump
OLD_LIBS+=usr/lib/libproc.so.4
OLD_LIBS+=usr/lib32/libproc.so.4
# 20171203: new clang import which bumps version from 5.0.0 to 5.0.1. # 20171203: new clang import which bumps version from 5.0.0 to 5.0.1.
OLD_FILES+=usr/lib/clang/5.0.0/include/sanitizer/allocator_interface.h OLD_FILES+=usr/lib/clang/5.0.0/include/sanitizer/allocator_interface.h
OLD_FILES+=usr/lib/clang/5.0.0/include/sanitizer/asan_interface.h OLD_FILES+=usr/lib/clang/5.0.0/include/sanitizer/asan_interface.h

View File

@ -967,7 +967,7 @@ dt_proc_create(dtrace_hdl_t *dtp, const char *file, char *const *argv,
#ifdef illumos #ifdef illumos
if ((dpr->dpr_proc = Pcreate(file, argv, &err, NULL, 0)) == NULL) { if ((dpr->dpr_proc = Pcreate(file, argv, &err, NULL, 0)) == NULL) {
#else #else
if ((err = proc_create(file, argv, pcf, child_arg, if ((err = proc_create(file, argv, NULL, pcf, child_arg,
&dpr->dpr_proc)) != 0) { &dpr->dpr_proc)) != 0) {
#endif #endif
return (dt_proc_error(dtp, dpr, return (dt_proc_error(dtp, dpr,

View File

@ -37,7 +37,7 @@ CFLAGS+= -I${SRCTOP}/cddl/contrib/opensolaris/lib/libctf/common \
CFLAGS+= -DNO_CTF CFLAGS+= -DNO_CTF
.endif .endif
SHLIB_MAJOR= 4 SHLIB_MAJOR= 5
MAN= MAN=

View File

@ -142,8 +142,8 @@ int proc_addr2sym(struct proc_handle *, uintptr_t, char *, size_t, GElf_Sym *);
int proc_attach(pid_t pid, int flags, struct proc_handle **pphdl); int proc_attach(pid_t pid, int flags, struct proc_handle **pphdl);
int proc_continue(struct proc_handle *); int proc_continue(struct proc_handle *);
int proc_clearflags(struct proc_handle *, int); int proc_clearflags(struct proc_handle *, int);
int proc_create(const char *, char * const *, proc_child_func *, void *, int proc_create(const char *, char * const *, char * const *,
struct proc_handle **); proc_child_func *, void *, struct proc_handle **);
int proc_detach(struct proc_handle *, int); int proc_detach(struct proc_handle *, int);
int proc_getflags(struct proc_handle *); int proc_getflags(struct proc_handle *);
int proc_name2sym(struct proc_handle *, const char *, const char *, int proc_name2sym(struct proc_handle *, const char *, const char *,

View File

@ -176,9 +176,10 @@ proc_attach(pid_t pid, int flags, struct proc_handle **pphdl)
} }
int int
proc_create(const char *file, char * const *argv, proc_child_func *pcf, proc_create(const char *file, char * const *argv, char * const *envp,
void *child_arg, struct proc_handle **pphdl) proc_child_func *pcf, void *child_arg, struct proc_handle **pphdl)
{ {
extern char * const *environ;
struct proc_handle *phdl; struct proc_handle *phdl;
int error, status; int error, status;
pid_t pid; pid_t pid;
@ -189,8 +190,7 @@ proc_create(const char *file, char * const *argv, proc_child_func *pcf,
error = 0; error = 0;
phdl = NULL; phdl = NULL;
/* Fork a new process. */ if ((pid = fork()) == -1)
if ((pid = vfork()) == -1)
error = errno; error = errno;
else if (pid == 0) { else if (pid == 0) {
/* The child expects to be traced. */ /* The child expects to be traced. */
@ -200,18 +200,14 @@ proc_create(const char *file, char * const *argv, proc_child_func *pcf,
if (pcf != NULL) if (pcf != NULL)
(*pcf)(child_arg); (*pcf)(child_arg);
/* Execute the specified file: */ if (envp != NULL)
environ = envp;
execvp(file, argv); execvp(file, argv);
/* Couldn't execute the file. */
_exit(2); _exit(2);
/* NOTREACHED */ /* NOTREACHED */
} else { } else {
/* The parent owns the process handle. */
error = proc_init(pid, 0, PS_IDLE, &phdl);
if (error != 0)
goto bad;
/* Wait for the child process to stop. */ /* Wait for the child process to stop. */
if (waitpid(pid, &status, WUNTRACED) == -1) { if (waitpid(pid, &status, WUNTRACED) == -1) {
error = errno; error = errno;
@ -221,11 +217,15 @@ proc_create(const char *file, char * const *argv, proc_child_func *pcf,
/* Check for an unexpected status. */ /* Check for an unexpected status. */
if (!WIFSTOPPED(status)) { if (!WIFSTOPPED(status)) {
error = EBUSY; error = ENOENT;
DPRINTFX("ERROR: child process %d status 0x%x", pid, status); DPRINTFX("ERROR: child process %d status 0x%x", pid, status);
goto bad; goto bad;
} }
phdl->status = PS_STOP;
/* The parent owns the process handle. */
error = proc_init(pid, 0, PS_IDLE, &phdl);
if (error == 0)
phdl->status = PS_STOP;
bad: bad:
if (error != 0 && phdl != NULL) { if (error != 0 && phdl != NULL) {

View File

@ -65,7 +65,7 @@ start_prog(const struct atf_tc *tc, bool sig)
argv[1] = NULL; argv[1] = NULL;
} }
error = proc_create(argv[0], argv, NULL, NULL, &phdl); error = proc_create(argv[0], argv, NULL, NULL, NULL, &phdl);
ATF_REQUIRE_EQ_MSG(error, 0, "failed to run '%s'", target_prog_file); ATF_REQUIRE_EQ_MSG(error, 0, "failed to run '%s'", target_prog_file);
ATF_REQUIRE(phdl != NULL); ATF_REQUIRE(phdl != NULL);