summaryrefslogtreecommitdiff
path: root/src/basic/env-file.c
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2022-03-08 10:08:05 +0100
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2022-03-29 16:17:56 +0200
commit25407ad2a785d10b1aadff0c99829ea0cf51082b (patch)
treedc40723e68f5120274359265924c3ea7573bd944 /src/basic/env-file.c
parent80e72f80bc407753582b421421c13ca50b675027 (diff)
downloadsystemd-25407ad2a785d10b1aadff0c99829ea0cf51082b.tar.gz
basic/env-file: make load-env-file deduplicate entries with the same key
We generally assume parsing like the shell would do it, so the last value should win when there are repeats.
Diffstat (limited to 'src/basic/env-file.c')
-rw-r--r--src/basic/env-file.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/src/basic/env-file.c b/src/basic/env-file.c
index 3efd77909c..14925e72e1 100644
--- a/src/basic/env-file.c
+++ b/src/basic/env-file.c
@@ -414,30 +414,39 @@ static int load_env_file_push_pairs(
const char *key, char *value,
void *userdata,
int *n_pushed) {
- char ***m = userdata;
+ char ***m = ASSERT_PTR(userdata);
+ bool added = false;
int r;
r = check_utf8ness_and_warn(filename, line, key, value);
if (r < 0)
return r;
+ /* Check if the key is present */
+ for (char **t = *m; t && *t; t += 2)
+ if (streq(t[0], key)) {
+ if (value)
+ r = free_and_replace(t[1], value);
+ else
+ r = free_and_strdup(t+1, "");
+ goto finish;
+ }
+
r = strv_extend(m, key);
if (r < 0)
return -ENOMEM;
- if (!value) {
- r = strv_extend(m, "");
- if (r < 0)
- return -ENOMEM;
- } else {
+ if (value)
r = strv_push(m, value);
- if (r < 0)
- return r;
- }
+ else
+ r = strv_extend(m, "");
+ added = true;
+ finish:
+ if (r < 0)
+ return r;
- if (n_pushed)
+ if (n_pushed && added)
(*n_pushed)++;
-
return 0;
}