mirror of
https://github.com/AuxXxilium/eudev.git
synced 2024-12-24 18:56:59 +07:00
fragment: properly handle quotes in assignments in EnvironmentFile= files
This commit is contained in:
parent
3875282802
commit
5f7c426e2a
3
TODO
3
TODO
@ -13,9 +13,6 @@
|
||||
* make failing dm detaching in systemd-shutdown less noisy
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=657497
|
||||
|
||||
* handle quotes in files read by EnvironmentFile= properly
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=661291
|
||||
|
||||
* load EnvironmentFile= when starting services, not when reloading configuration
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=661282
|
||||
|
||||
|
@ -1360,7 +1360,7 @@ static int config_parse_env_file(
|
||||
}
|
||||
|
||||
while (!feof(f)) {
|
||||
char l[LINE_MAX], *p;
|
||||
char l[LINE_MAX], *p, *u;
|
||||
char **t;
|
||||
|
||||
if (!fgets(l, sizeof(l), f)) {
|
||||
@ -1381,7 +1381,21 @@ static int config_parse_env_file(
|
||||
if (strchr(COMMENTS, *p))
|
||||
continue;
|
||||
|
||||
t = strv_env_set(*env, p);
|
||||
if (!(u = normalize_env_assignment(p))) {
|
||||
log_error("Out of memory");
|
||||
r = -ENOMEM;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
t = strv_env_set(*env, u);
|
||||
free(u);
|
||||
|
||||
if (!t) {
|
||||
log_error("Out of memory");
|
||||
r = -ENOMEM;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
strv_free(*env);
|
||||
*env = t;
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ int main(int argc, char *argv[]) {
|
||||
NULL
|
||||
};
|
||||
|
||||
char **i, **r;
|
||||
char **i, **r, *t;
|
||||
|
||||
r = replace_env_argv((char**) line, (char**) env);
|
||||
|
||||
@ -56,4 +56,45 @@ int main(int argc, char *argv[]) {
|
||||
|
||||
strv_free(r);
|
||||
|
||||
t = normalize_env_assignment("foo=bar");
|
||||
printf("%s\n", t);
|
||||
free(t);
|
||||
|
||||
t = normalize_env_assignment("=bar");
|
||||
printf("%s\n", t);
|
||||
free(t);
|
||||
|
||||
t = normalize_env_assignment("foo=");
|
||||
printf("%s\n", t);
|
||||
free(t);
|
||||
|
||||
t = normalize_env_assignment("=");
|
||||
printf("%s\n", t);
|
||||
free(t);
|
||||
|
||||
t = normalize_env_assignment("");
|
||||
printf("%s\n", t);
|
||||
free(t);
|
||||
|
||||
t = normalize_env_assignment("a=\"waldo\"");
|
||||
printf("%s\n", t);
|
||||
free(t);
|
||||
|
||||
t = normalize_env_assignment("a=\"waldo");
|
||||
printf("%s\n", t);
|
||||
free(t);
|
||||
|
||||
t = normalize_env_assignment("a=waldo\"");
|
||||
printf("%s\n", t);
|
||||
free(t);
|
||||
|
||||
t = normalize_env_assignment("a=\'");
|
||||
printf("%s\n", t);
|
||||
free(t);
|
||||
|
||||
t = normalize_env_assignment("a=\'\'");
|
||||
printf("%s\n", t);
|
||||
free(t);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
38
src/util.c
38
src/util.c
@ -3326,6 +3326,44 @@ char *unquote(const char *s, const char* quotes) {
|
||||
return strdup(s);
|
||||
}
|
||||
|
||||
char *normalize_env_assignment(const char *s) {
|
||||
char *name, *value, *p, *r;
|
||||
|
||||
p = strchr(s, '=');
|
||||
|
||||
if (!p) {
|
||||
if (!(r = strdup(s)))
|
||||
return NULL;
|
||||
|
||||
return strstrip(r);
|
||||
}
|
||||
|
||||
if (!(name = strndup(s, p - s)))
|
||||
return NULL;
|
||||
|
||||
if (!(p = strdup(p+1))) {
|
||||
free(name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
value = unquote(strstrip(p), QUOTES);
|
||||
free(p);
|
||||
|
||||
if (!value) {
|
||||
free(p);
|
||||
free(name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (asprintf(&r, "%s=%s", name, value) < 0)
|
||||
r = NULL;
|
||||
|
||||
free(value);
|
||||
free(name);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
int wait_for_terminate(pid_t pid, siginfo_t *status) {
|
||||
assert(pid >= 1);
|
||||
assert(status);
|
||||
|
@ -355,6 +355,7 @@ char *ellipsize(const char *s, unsigned length, unsigned percent);
|
||||
int touch(const char *path);
|
||||
|
||||
char *unquote(const char *s, const char *quotes);
|
||||
char *normalize_env_assignment(const char *s);
|
||||
|
||||
int wait_for_terminate(pid_t pid, siginfo_t *status);
|
||||
int wait_for_terminate_and_warn(const char *name, pid_t pid);
|
||||
|
Loading…
Reference in New Issue
Block a user