aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2020-12-02 18:21:32 +0200
committerSergey Poznyakoff <gray@gnu.org>2020-12-02 18:21:32 +0200
commitfd8d41c090765c010b3043576f79ca8828bd2c94 (patch)
tree3278cee9b271a2dbe16de274db6813f6f8baae3c
parent23cad612301853307888a2a9ac2bc50be49e40fa (diff)
downloadpies-fd8d41c090765c010b3043576f79ca8828bd2c94.tar.gz
pies-fd8d41c090765c010b3043576f79ca8828bd2c94.tar.bz2
Actually fix the reporting of argv when expandenv is set.
* src/progman.c (prog_start_prologue): Split into two functions: prog_init, invoked before fork, and prog_start_prologue proper, invoked after fork. prog_init initializes the environment, argc, and argv associated with prog. (progman_run_comp): Call prog_init before calling prog_start_prologue (the function is called from child process). (prog_start): Run prog_init before forking.
-rw-r--r--src/progman.c84
1 files changed, 62 insertions, 22 deletions
diff --git a/src/progman.c b/src/progman.c
index db39b6d..d849368 100644
--- a/src/progman.c
+++ b/src/progman.c
@@ -156,6 +156,7 @@ destroy_prog (struct prog **pp)
switch (p->type)
{
case TYPE_COMPONENT:
+ environ_free (p->v.p.env);
if (p->v.p.comp->flags & CF_EXPANDENV)
argv_free (p->v.p.argv);
component_ref_decr (p->v.p.comp);
@@ -817,40 +818,49 @@ progman_ws_error (const char *fmt, ...)
va_end (ap);
}
-static void
-prog_start_prologue (struct prog *prog)
+/*
+ * Initialization of the environment and argc/argv members of
+ * struct prog. For regular components this is done in the main
+ * process, so that argv can be reported correctly via the ctl
+ * interface. For tcpmux components, which are run from the
+ * listener child, this is not so. That does little harm as
+ * these components are not visible from the ctl interface anyway.
+ */
+static int
+prog_init (struct prog *prog)
{
- if (prog->v.p.comp->dir)
+ if ((prog->v.p.env = environ_create (environ)) == NULL)
{
- debug (1, (_("chdir %s"), prog->v.p.comp->dir));
- if (chdir (prog->v.p.comp->dir))
- logmsg (LOG_ERR, _("%s: cannot change to directory %s: %s"),
- prog_tag (prog), prog->v.p.comp->dir, strerror (errno));
+ logmsg (LOG_CRIT, "environ_create: %s", strerror (errno));
+ return -1;
}
-
- prog->v.p.env = environ_create (environ);
+
if (prog->v.p.comp->flags & CF_SOCKENV)
{
size_t i;
for (i = 0; sockenv_var[i]; i++)
environ_unset (prog->v.p.env, sockenv_var[i], NULL);
}
- envop_exec (prog->v.p.comp->envop, prog->v.p.env);
+
+ if (envop_exec (prog->v.p.comp->envop, prog->v.p.env))
+ {
+ logmsg (LOG_CRIT, "environ_exec: %s", strerror (errno));
+ return -1;
+ }
+
if (SYSVINIT_ACTIVE)
{
size_t i;
for (i = 0; sysvinit_environ_hint[i]; i++)
- environ_add (prog->v.p.env, sysvinit_environ_hint[i]);
+ {
+ if (environ_add (prog->v.p.env, sysvinit_environ_hint[i]))
+ {
+ logmsg (LOG_CRIT, "environ_add: %s", strerror (errno));
+ return -1;
+ }
+ }
}
- debug_environ (prog, 4);
-
- pies_priv_setup (&prog->v.p.comp->privs);
- if (prog->v.p.comp->umask)
- umask (prog->v.p.comp->umask);
-
- set_limits (prog_tag (prog),
- prog->v.p.comp->limits ?
- prog->v.p.comp->limits : pies_limits);
+ debug_environ (prog, 4);
if (prog->v.p.comp->flags & CF_EXPANDENV)
{
@@ -863,7 +873,7 @@ prog_start_prologue (struct prog *prog)
{
logmsg (LOG_ERR, _("%s: can't split command line: %s"),
prog_tag (prog), wordsplit_strerror (&ws));
- _exit (127);
+ return -1;
}
wordsplit_get_words (&ws, &prog->v.p.argc, &prog->v.p.argv);
wordsplit_free (&ws);
@@ -873,7 +883,7 @@ prog_start_prologue (struct prog *prog)
prog->v.p.argc = prog->v.p.comp->argc;
prog->v.p.argv = prog->v.p.comp->argv;
}
-
+
if (debug_level >= 1 && prog->v.p.argv)
{
int i;
@@ -882,6 +892,27 @@ prog_start_prologue (struct prog *prog)
logmsg_printf (LOG_DEBUG, " %s", quotearg (prog->v.p.argv[i]));
logmsg_printf (LOG_DEBUG, "\n");
}
+ return 0;
+}
+
+static void
+prog_start_prologue (struct prog *prog)
+{
+ if (prog->v.p.comp->dir)
+ {
+ debug (1, (_("chdir %s"), prog->v.p.comp->dir));
+ if (chdir (prog->v.p.comp->dir))
+ logmsg (LOG_ERR, _("%s: cannot change to directory %s: %s"),
+ prog_tag (prog), prog->v.p.comp->dir, strerror (errno));
+ }
+
+ pies_priv_setup (&prog->v.p.comp->privs);
+ if (prog->v.p.comp->umask)
+ umask (prog->v.p.comp->umask);
+
+ set_limits (prog_tag (prog),
+ prog->v.p.comp->limits ?
+ prog->v.p.comp->limits : pies_limits);
}
static void
@@ -905,6 +936,10 @@ prog_execute (struct prog *prog)
_exit (EX_SOFTWARE);
}
+/*
+ * Run a TCPMUX component. This function is invoked from a child
+ * process.
+ */
void
progman_run_comp (struct component *comp, int fd,
union pies_sockaddr_storage *sa, socklen_t salen)
@@ -914,6 +949,8 @@ progman_run_comp (struct component *comp, int fd,
prog->v.p.sa_storage = *sa;
prog->v.p.sa_len = salen;
prog->v.p.cclass = conn_class_lookup (comp->tag, sa, salen);
+ if (prog_init (prog))
+ _exit (127);
prog_start_prologue (prog);
prog_sockenv (prog);
prog_execute (prog);
@@ -1004,6 +1041,9 @@ prog_start (struct prog *prog)
return;
}
+ if (prog_init (prog))
+ return; //FIXME
+
redir[RETR_OUT] = open_redirector (prog, RETR_OUT);
redir[RETR_ERR] = open_redirector (prog, RETR_ERR);

Return to:

Send suggestions and report system problems to the System administrator.