4bff0a
From 5e75fbf0ccc427fbe5151ab2096f75dcad5b00e7 Mon Sep 17 00:00:00 2001
4bff0a
From: Lennart Poettering <lennart@poettering.net>
4bff0a
Date: Thu, 5 Jul 2018 09:56:54 +0200
4bff0a
Subject: [PATCH] core: swap order of "n_storage_fds" and "n_socket_fds"
4bff0a
 parameters
4bff0a
4bff0a
When process fd lists to pass to activated programs we always place the
4bff0a
socket activation fds first, and the storage fds last. Irritatingly in
4bff0a
almost all calls the "n_storage_fds" parameter (i.e. the number of
4bff0a
storage fds to pass) came first so far, and the "n_socket_fds" parameter
4bff0a
second. Let's clean this up, and specify the number of fds in the order
4bff0a
the fds themselves are passed.
4bff0a
4bff0a
(Also, let's fix one more case where "unsigned" was used to size an
4bff0a
array, while we should use "size_t" instead.)
4bff0a
4bff0a
(cherry picked from commit 25b583d7ffd699384435eba8e49f6ce927a83af0)
4bff0a
4bff0a
Resolves: #1683334
4bff0a
---
4bff0a
 src/core/execute.c | 14 +++++++-------
4bff0a
 src/core/execute.h |  2 +-
4bff0a
 src/core/service.c | 25 ++++++++++++++-----------
4bff0a
 3 files changed, 22 insertions(+), 19 deletions(-)
4bff0a
4bff0a
diff --git a/src/core/execute.c b/src/core/execute.c
4bff0a
index ffb92ddfc7..7476ac51da 100644
4bff0a
--- a/src/core/execute.c
4bff0a
+++ b/src/core/execute.c
4bff0a
@@ -147,11 +147,11 @@ static int shift_fds(int fds[], size_t n_fds) {
4bff0a
         return 0;
4bff0a
 }
4bff0a
 
4bff0a
-static int flags_fds(const int fds[], size_t n_storage_fds, size_t n_socket_fds, bool nonblock) {
4bff0a
+static int flags_fds(const int fds[], size_t n_socket_fds, size_t n_storage_fds, bool nonblock) {
4bff0a
         size_t i, n_fds;
4bff0a
         int r;
4bff0a
 
4bff0a
-        n_fds = n_storage_fds + n_socket_fds;
4bff0a
+        n_fds = n_socket_fds + n_storage_fds;
4bff0a
         if (n_fds <= 0)
4bff0a
                 return 0;
4bff0a
 
4bff0a
@@ -2718,8 +2718,8 @@ static int exec_child(
4bff0a
                 int socket_fd,
4bff0a
                 int named_iofds[3],
4bff0a
                 int *fds,
4bff0a
-                size_t n_storage_fds,
4bff0a
                 size_t n_socket_fds,
4bff0a
+                size_t n_storage_fds,
4bff0a
                 char **files_env,
4bff0a
                 int user_lookup_fd,
4bff0a
                 int *exit_status) {
4bff0a
@@ -3171,7 +3171,7 @@ static int exec_child(
4bff0a
         if (r >= 0)
4bff0a
                 r = shift_fds(fds, n_fds);
4bff0a
         if (r >= 0)
4bff0a
-                r = flags_fds(fds, n_storage_fds, n_socket_fds, context->non_blocking);
4bff0a
+                r = flags_fds(fds, n_socket_fds, n_storage_fds, context->non_blocking);
4bff0a
         if (r < 0) {
4bff0a
                 *exit_status = EXIT_FDS;
4bff0a
                 return log_unit_error_errno(unit, r, "Failed to adjust passed file descriptors: %m");
4bff0a
@@ -3449,7 +3449,7 @@ int exec_spawn(Unit *unit,
4bff0a
         assert(context);
4bff0a
         assert(ret);
4bff0a
         assert(params);
4bff0a
-        assert(params->fds || (params->n_storage_fds + params->n_socket_fds <= 0));
4bff0a
+        assert(params->fds || (params->n_socket_fds + params->n_storage_fds <= 0));
4bff0a
 
4bff0a
         if (context->std_input == EXEC_INPUT_SOCKET ||
4bff0a
             context->std_output == EXEC_OUTPUT_SOCKET ||
4bff0a
@@ -3469,8 +3469,8 @@ int exec_spawn(Unit *unit,
4bff0a
         } else {
4bff0a
                 socket_fd = -1;
4bff0a
                 fds = params->fds;
4bff0a
-                n_storage_fds = params->n_storage_fds;
4bff0a
                 n_socket_fds = params->n_socket_fds;
4bff0a
+                n_storage_fds = params->n_storage_fds;
4bff0a
         }
4bff0a
 
4bff0a
         r = exec_context_named_iofds(context, params, named_iofds);
4bff0a
@@ -3509,8 +3509,8 @@ int exec_spawn(Unit *unit,
4bff0a
                                socket_fd,
4bff0a
                                named_iofds,
4bff0a
                                fds,
4bff0a
-                               n_storage_fds,
4bff0a
                                n_socket_fds,
4bff0a
+                               n_storage_fds,
4bff0a
                                files_env,
4bff0a
                                unit->manager->user_lookup_fds[1],
4bff0a
                                &exit_status);
4bff0a
diff --git a/src/core/execute.h b/src/core/execute.h
4bff0a
index 77ffe82323..49705e0d3a 100644
4bff0a
--- a/src/core/execute.h
4bff0a
+++ b/src/core/execute.h
4bff0a
@@ -296,8 +296,8 @@ struct ExecParameters {
4bff0a
 
4bff0a
         int *fds;
4bff0a
         char **fd_names;
4bff0a
-        size_t n_storage_fds;
4bff0a
         size_t n_socket_fds;
4bff0a
+        size_t n_storage_fds;
4bff0a
 
4bff0a
         ExecFlags flags;
4bff0a
         bool selinux_context_net:1;
4bff0a
diff --git a/src/core/service.c b/src/core/service.c
4bff0a
index db17221888..7f8ce1b998 100644
4bff0a
--- a/src/core/service.c
4bff0a
+++ b/src/core/service.c
4bff0a
@@ -1178,21 +1178,23 @@ static int service_coldplug(Unit *u) {
4bff0a
         return 0;
4bff0a
 }
4bff0a
 
4bff0a
-static int service_collect_fds(Service *s,
4bff0a
-                               int **fds,
4bff0a
-                               char ***fd_names,
4bff0a
-                               unsigned *n_storage_fds,
4bff0a
-                               unsigned *n_socket_fds) {
4bff0a
+static int service_collect_fds(
4bff0a
+                Service *s,
4bff0a
+                int **fds,
4bff0a
+                char ***fd_names,
4bff0a
+                size_t *n_socket_fds,
4bff0a
+                size_t *n_storage_fds) {
4bff0a
 
4bff0a
         _cleanup_strv_free_ char **rfd_names = NULL;
4bff0a
         _cleanup_free_ int *rfds = NULL;
4bff0a
-        unsigned rn_socket_fds = 0, rn_storage_fds = 0;
4bff0a
+        size_t rn_socket_fds = 0, rn_storage_fds = 0;
4bff0a
         int r;
4bff0a
 
4bff0a
         assert(s);
4bff0a
         assert(fds);
4bff0a
         assert(fd_names);
4bff0a
         assert(n_socket_fds);
4bff0a
+        assert(n_storage_fds);
4bff0a
 
4bff0a
         if (s->socket_fd >= 0) {
4bff0a
 
4bff0a
@@ -1256,7 +1258,7 @@ static int service_collect_fds(Service *s,
4bff0a
 
4bff0a
         if (s->n_fd_store > 0) {
4bff0a
                 ServiceFDStore *fs;
4bff0a
-                unsigned n_fds;
4bff0a
+                size_t n_fds;
4bff0a
                 char **nl;
4bff0a
                 int *t;
4bff0a
 
4bff0a
@@ -1325,9 +1327,10 @@ static int service_spawn(
4bff0a
                 .stdin_fd   = -1,
4bff0a
                 .stdout_fd  = -1,
4bff0a
                 .stderr_fd  = -1,
4bff0a
+                .exec_fd    = -1,
4bff0a
         };
4bff0a
         _cleanup_strv_free_ char **final_env = NULL, **our_env = NULL, **fd_names = NULL;
4bff0a
-        unsigned n_storage_fds = 0, n_socket_fds = 0, n_env = 0;
4bff0a
+        size_t n_socket_fds = 0, n_storage_fds = 0, n_env = 0;
4bff0a
         _cleanup_free_ int *fds = NULL;
4bff0a
         pid_t pid;
4bff0a
         int r;
4bff0a
@@ -1353,11 +1356,11 @@ static int service_spawn(
4bff0a
             s->exec_context.std_output == EXEC_OUTPUT_SOCKET ||
4bff0a
             s->exec_context.std_error == EXEC_OUTPUT_SOCKET) {
4bff0a
 
4bff0a
-                r = service_collect_fds(s, &fds, &fd_names, &n_storage_fds, &n_socket_fds);
4bff0a
+                r = service_collect_fds(s, &fds, &fd_names, &n_socket_fds, &n_storage_fds);
4bff0a
                 if (r < 0)
4bff0a
                         return r;
4bff0a
 
4bff0a
-                log_unit_debug(UNIT(s), "Passing %i fds to service", n_storage_fds + n_socket_fds);
4bff0a
+                log_unit_debug(UNIT(s), "Passing %zu fds to service", n_socket_fds + n_storage_fds);
4bff0a
         }
4bff0a
 
4bff0a
         r = service_arm_timer(s, usec_add(now(CLOCK_MONOTONIC), timeout));
4bff0a
@@ -1450,8 +1453,8 @@ static int service_spawn(
4bff0a
         exec_params.environment = final_env;
4bff0a
         exec_params.fds = fds;
4bff0a
         exec_params.fd_names = fd_names;
4bff0a
-        exec_params.n_storage_fds = n_storage_fds;
4bff0a
         exec_params.n_socket_fds = n_socket_fds;
4bff0a
+        exec_params.n_storage_fds = n_storage_fds;
4bff0a
         exec_params.watchdog_usec = s->watchdog_usec;
4bff0a
         exec_params.selinux_context_net = s->socket_fd_selinux_context_net;
4bff0a
         if (s->type == SERVICE_IDLE)