]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic/env-util: add variant of strv_env_replace() that does strdup internally
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 15 Feb 2021 13:09:30 +0000 (14:09 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 15 Feb 2021 19:43:41 +0000 (20:43 +0100)
src/basic/env-util.c
src/basic/env-util.h
src/core/manager.c
src/home/homectl.c
src/nspawn/nspawn.c
src/shared/user-record.c

index a75186015e366ba90df5288be99471f74a18897a..5335c6784dbcbae20839c4b325969c150f89fd17 100644 (file)
@@ -370,9 +370,8 @@ int strv_env_replace(char ***l, char *p) {
 
         assert(p);
 
-        /* Replace first occurrence of the env var or add a new one in the string list. Drop other occurrences. Edits
-         * in-place. Does not copy p.  p must be a valid key=value assignment.
-         */
+        /* Replace first occurrence of the env var or add a new one in the string list. Drop other
+         * occurrences. Edits in-place. Does not copy p. p must be a valid key=value assignment. */
 
         t = strchr(p, '=');
         if (!t)
@@ -395,6 +394,23 @@ int strv_env_replace(char ***l, char *p) {
         return 1;
 }
 
+int strv_env_replace_strdup(char ***l, const char *assignment) {
+        int r;
+
+        /* Like strv_env_replace(), but copies the argument. */
+
+        _cleanup_free_ char *p = strdup(assignment);
+        if (!p)
+                return -ENOMEM;
+
+        r = strv_env_replace(l, p);
+        if (r < 0)
+                return r;
+
+        TAKE_PTR(p);
+        return r;
+}
+
 char **strv_env_set(char **x, const char *p) {
         _cleanup_strv_free_ char **ret = NULL;
         size_t n, m;
index 5d8afec0289203d504ff1e695c53832a8059f0bf..922cfe1c44a7e585d3d0e832b95bac8a3b882005 100644 (file)
@@ -46,6 +46,7 @@ char **strv_env_set(char **x, const char *p); /* New copy ... */
 char **strv_env_unset(char **l, const char *p); /* In place ... */
 char **strv_env_unset_many(char **l, ...) _sentinel_;
 int strv_env_replace(char ***l, char *p); /* In place ... */
+int strv_env_replace_strdup(char ***l, const char *assignment);
 
 char *strv_env_get_n(char **l, const char *name, size_t k, unsigned flags) _pure_;
 char *strv_env_get(char **x, const char *n) _pure_;
index 0a7a4518356b266741c3956adb2fe4b3eb7bc1f1..377c0b1ccc0caec3173aa789511e9282bbf15aa7 100644 (file)
@@ -641,22 +641,14 @@ int manager_default_environment(Manager *m) {
                 /* Import locale variables LC_*= from configuration */
                 (void) locale_setup(&m->transient_environment);
         } else {
-                _cleanup_free_ char *k = NULL;
-
-                /* The user manager passes its own environment
-                 * along to its children, except for $PATH. */
+                /* The user manager passes its own environment along to its children, except for $PATH. */
                 m->transient_environment = strv_copy(environ);
                 if (!m->transient_environment)
                         return log_oom();
 
-                k = strdup("PATH=" DEFAULT_USER_PATH);
-                if (!k)
-                        return log_oom();
-
-                r = strv_env_replace(&m->transient_environment, k);
+                r = strv_env_replace_strdup(&m->transient_environment, "PATH=" DEFAULT_USER_PATH);
                 if (r < 0)
                         return log_oom();
-                TAKE_PTR(k);
         }
 
         sanitize_environment(m->transient_environment);
index bf35fa03f0d40c3a27c544530ab3a585caf779a9..dfbd12a4dfd83bf41c7fa6fdc495a8f42704fdfa 100644 (file)
@@ -2511,7 +2511,7 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case ARG_SETENV: {
-                        _cleanup_free_ char **l = NULL, **k = NULL;
+                        _cleanup_free_ char **l = NULL;
                         _cleanup_(json_variant_unrefp) JsonVariant *ne = NULL;
                         JsonVariant *e;
 
@@ -2524,7 +2524,8 @@ static int parse_argv(int argc, char *argv[]) {
                         }
 
                         if (!env_assignment_is_valid(optarg))
-                                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Environment assignment '%s' not valid.", optarg);
+                                return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+                                                       "Environment assignment '%s' not valid.", optarg);
 
                         e = json_variant_by_key(arg_identity_extra, "environment");
                         if (e) {
@@ -2533,13 +2534,13 @@ static int parse_argv(int argc, char *argv[]) {
                                         return log_error_errno(r, "Failed to parse JSON environment field: %m");
                         }
 
-                        k = strv_env_set(l, optarg);
-                        if (!k)
-                                return log_oom();
+                        r = strv_env_replace_strdup(&l, optarg);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to replace JSON environment field: %m");
 
-                        strv_sort(k);
+                        strv_sort(l);
 
-                        r = json_variant_new_array_strv(&ne, k);
+                        r = json_variant_new_array_strv(&ne, l);
                         if (r < 0)
                                 return log_error_errno(r, "Failed to allocate environment list JSON: %m");
 
index e1c55d0542749a2f578e0fb499df10e6e5bc309e..28c51fc76f42aa3d753c6a20d09b975a56c0792b 100644 (file)
@@ -1109,17 +1109,13 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case 'E': {
-                        char **n;
-
                         if (!env_assignment_is_valid(optarg))
                                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
                                                        "Environment variable assignment '%s' is not valid.", optarg);
+                        r = strv_env_replace_strdup(&arg_setenv, optarg);
+                        if (r < 0)
+                                return r;
 
-                        n = strv_env_set(arg_setenv, optarg);
-                        if (!n)
-                                return log_oom();
-
-                        strv_free_and_replace(arg_setenv, n);
                         arg_settings_mask |= SETTING_ENVIRONMENT;
                         break;
                 }
index 0b07e4427eeb4a96b806d7cff28cc90d9b991124..569102f5f27617f275d734c57e7b6cb2f8a05aea 100644 (file)
@@ -620,7 +620,6 @@ static int json_dispatch_environment(const char *name, JsonVariant *variant, Jso
                 return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not an array.", strna(name));
 
         for (i = 0; i < json_variant_elements(variant); i++) {
-                _cleanup_free_ char *c = NULL;
                 JsonVariant *e;
                 const char *a;
 
@@ -633,19 +632,12 @@ static int json_dispatch_environment(const char *name, JsonVariant *variant, Jso
                 if (!env_assignment_is_valid(a))
                         return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not an array of environment variables.", strna(name));
 
-                c = strdup(a);
-                if (!c)
-                        return json_log_oom(variant, flags);
-
-                r = strv_env_replace(&n, c);
+                r = strv_env_replace_strdup(&n, a);
                 if (r < 0)
                         return json_log_oom(variant, flags);
-
-                c = NULL;
         }
 
-        strv_free_and_replace(*l, n);
-        return 0;
+        return strv_free_and_replace(*l, n);
 }
 
 int json_dispatch_user_disposition(const char *name, JsonVariant *variant, JsonDispatchFlags flags, void *userdata) {