summaryrefslogtreecommitdiffstats
path: root/src/socket-activate
diff options
context:
space:
mode:
authorFrantisek Sumsal <fsumsal@redhat.com>2023-06-16 19:05:57 +0200
committerFrantisek Sumsal <fsumsal@redhat.com>2023-06-16 20:42:43 +0200
commit9ccd59f751bb639d31155dc6c8d3b76c1a98ef1c (patch)
treed5cf04cba32ad40701d71b5e022f22eaca1d1f17 /src/socket-activate
parenttest: add a couple of tests for systemd-journal-gatewayd (diff)
downloadsystemd-9ccd59f751bb639d31155dc6c8d3b76c1a98ef1c.tar.xz
systemd-9ccd59f751bb639d31155dc6c8d3b76c1a98ef1c.zip
socket-activate: make a copy of the command name and arguments
When we call safe_fork() with the first argument set (process name), we call rename_process() that zeroes out saved argv (that was saved by save_argc_argv() in the main func defined by DEFINE_MAIN_FUNC()). In this case this means that with --accept both the target executable name and its arguments will be empty strings: ``` $ systemd-socket-activate --accept --listen 1111 cat & Listening on [::]:1111 as 3. $ curl localhost:1111 Communication attempt on fd 3. Connection from 127.0.0.1:52948 to [::ffff:127.0.0.1]:1111 Spawned cat (cat) as PID 10576. Execing () Failed to execp (): No such file or directory Child 10576 died with code 1 curl: (56) Recv failure: Connection reset by peer ``` Let's make a copy of the necessary arguments beforehand and use it instead to fix this.
Diffstat (limited to 'src/socket-activate')
-rw-r--r--src/socket-activate/socket-activate.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/socket-activate/socket-activate.c b/src/socket-activate/socket-activate.c
index 1caa30d7d4..2e19d125c3 100644
--- a/src/socket-activate/socket-activate.c
+++ b/src/socket-activate/socket-activate.c
@@ -443,6 +443,7 @@ static int parse_argv(int argc, char *argv[]) {
static int run(int argc, char **argv) {
_cleanup_close_ int epoll_fd = -EBADF;
+ _cleanup_strv_free_ char **exec_argv = NULL;
int r, n;
log_show_color(true);
@@ -453,6 +454,12 @@ static int run(int argc, char **argv) {
if (r <= 0)
return r;
+ exec_argv = strv_copy(arg_args);
+ if (!exec_argv)
+ return log_oom();
+
+ assert(strv_length(exec_argv) > 0);
+
r = install_chld_handler();
if (r < 0)
return r;
@@ -475,14 +482,14 @@ static int run(int argc, char **argv) {
log_info("Communication attempt on fd %i.", event.data.fd);
if (arg_accept) {
- r = do_accept(argv[optind], argv + optind, event.data.fd);
+ r = do_accept(exec_argv[0], exec_argv, event.data.fd);
if (r < 0)
return r;
} else
break;
}
- return exec_process(argv[optind], argv + optind, SD_LISTEN_FDS_START, (size_t) n);
+ return exec_process(exec_argv[0], exec_argv, SD_LISTEN_FDS_START, (size_t) n);
}
DEFINE_MAIN_FUNCTION(run);