Don't stop at first match when updating environment.

pull/3307/head
nicm 2022-08-15 08:37:03 +00:00
parent e139f977b1
commit cfdc5b62ad
1 changed files with 9 additions and 6 deletions

View File

@ -182,9 +182,11 @@ void
environ_update(struct options *oo, struct environ *src, struct environ *dst) environ_update(struct options *oo, struct environ *src, struct environ *dst)
{ {
struct environ_entry *envent; struct environ_entry *envent;
struct environ_entry *envent1;
struct options_entry *o; struct options_entry *o;
struct options_array_item *a; struct options_array_item *a;
union options_value *ov; union options_value *ov;
int found;
o = options_get(oo, "update-environment"); o = options_get(oo, "update-environment");
if (o == NULL) if (o == NULL)
@ -192,14 +194,15 @@ environ_update(struct options *oo, struct environ *src, struct environ *dst)
a = options_array_first(o); a = options_array_first(o);
while (a != NULL) { while (a != NULL) {
ov = options_array_item_value(a); ov = options_array_item_value(a);
RB_FOREACH(envent, environ, src) { found = 0;
if (fnmatch(ov->string, envent->name, 0) == 0) RB_FOREACH_SAFE(envent, environ, src, envent1) {
break; if (fnmatch(ov->string, envent->name, 0) == 0) {
environ_set(dst, envent->name, 0, "%s", envent->value);
found = 1;
}
} }
if (envent == NULL) if (!found)
environ_clear(dst, ov->string); environ_clear(dst, ov->string);
else
environ_set(dst, envent->name, 0, "%s", envent->value);
a = options_array_next(a); a = options_array_next(a);
} }
} }