mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-01-12 09:17:44 +03:00
basic: fix strv_env_get_n for unclean arrays
If an environment array has duplicates, strv_env_get_n returns the results for the first match. This is wrong, because later entries in the environment are supposed to replace earlier entries.
This commit is contained in:
parent
1bd2d4e31b
commit
6162512cde
@ -462,7 +462,7 @@ char *strv_env_get_n(char **l, const char *name, size_t k) {
|
||||
if (k <= 0)
|
||||
return NULL;
|
||||
|
||||
STRV_FOREACH(i, l)
|
||||
STRV_FOREACH_BACKWARDS(i, l)
|
||||
if (strneq(*i, name, k) &&
|
||||
(*i)[k] == '=')
|
||||
return *i + k + 1;
|
||||
|
@ -45,6 +45,16 @@ static void test_strv_env_delete(void) {
|
||||
assert_se(strv_length(d) == 2);
|
||||
}
|
||||
|
||||
static void test_strv_env_get(void) {
|
||||
char **l;
|
||||
|
||||
l = STRV_MAKE("ONE_OR_TWO=1", "THREE=3", "ONE_OR_TWO=2", "FOUR=4");
|
||||
|
||||
assert_se(streq(strv_env_get(l, "ONE_OR_TWO"), "2"));
|
||||
assert_se(streq(strv_env_get(l, "THREE"), "3"));
|
||||
assert_se(streq(strv_env_get(l, "FOUR"), "4"));
|
||||
}
|
||||
|
||||
static void test_strv_env_unset(void) {
|
||||
_cleanup_strv_free_ char **l = NULL;
|
||||
|
||||
@ -211,6 +221,7 @@ static void test_env_assignment_is_valid(void) {
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
test_strv_env_delete();
|
||||
test_strv_env_get();
|
||||
test_strv_env_unset();
|
||||
test_strv_env_set();
|
||||
test_strv_env_merge();
|
||||
|
Loading…
Reference in New Issue
Block a user