mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-23 17:34:00 +03:00
util: fix bad strstrip() return value in normalize_env_assignment()
https://bugzilla.redhat.com/show_bug.cgi?id=858780
This commit is contained in:
parent
93e4c84bb3
commit
57f3067825
@ -3881,7 +3881,8 @@ char *unquote(const char *s, const char* quotes) {
|
||||
|
||||
/* This is rather stupid, simply removes the heading and
|
||||
* trailing quotes if there is one. Doesn't care about
|
||||
* escaping or anything. */
|
||||
* escaping or anything. We should make this smarter one
|
||||
* day...*/
|
||||
|
||||
l = strlen(s);
|
||||
if (l < 2)
|
||||
@ -3894,39 +3895,40 @@ char *unquote(const char *s, const char* quotes) {
|
||||
}
|
||||
|
||||
char *normalize_env_assignment(const char *s) {
|
||||
char *name, *value, *p, *r;
|
||||
_cleanup_free_ char *name = NULL, *value = NULL, *p = NULL;
|
||||
char *eq, *r;
|
||||
|
||||
p = strchr(s, '=');
|
||||
eq = strchr(s, '=');
|
||||
if (!eq) {
|
||||
char *t;
|
||||
|
||||
if (!p) {
|
||||
if (!(r = strdup(s)))
|
||||
r = strdup(s);
|
||||
if (!r)
|
||||
return NULL;
|
||||
|
||||
return strstrip(r);
|
||||
t = strstrip(r);
|
||||
if (t == r)
|
||||
return r;
|
||||
|
||||
memmove(r, t, strlen(t) + 1);
|
||||
return r;
|
||||
}
|
||||
|
||||
if (!(name = strndup(s, p - s)))
|
||||
name = strndup(s, eq - s);
|
||||
if (!name)
|
||||
return NULL;
|
||||
|
||||
if (!(p = strdup(p+1))) {
|
||||
free(name);
|
||||
p = strdup(eq + 1);
|
||||
if (!p)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
value = unquote(strstrip(p), QUOTES);
|
||||
free(p);
|
||||
|
||||
if (!value) {
|
||||
free(name);
|
||||
if (!value)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (asprintf(&r, "%s=%s", name, value) < 0)
|
||||
if (asprintf(&r, "%s=%s", strstrip(name), value) < 0)
|
||||
r = NULL;
|
||||
|
||||
free(value);
|
||||
free(name);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -104,6 +104,22 @@ int main(int argc, char *argv[]) {
|
||||
printf("%s\n", t);
|
||||
free(t);
|
||||
|
||||
t = normalize_env_assignment(" xyz ");
|
||||
printf("<%s>\n", t);
|
||||
free(t);
|
||||
|
||||
t = normalize_env_assignment(" xyz = bar ");
|
||||
printf("<%s>\n", t);
|
||||
free(t);
|
||||
|
||||
t = normalize_env_assignment(" xyz = 'bar ' ");
|
||||
printf("<%s>\n", t);
|
||||
free(t);
|
||||
|
||||
t = normalize_env_assignment(" ' xyz' = 'bar ' ");
|
||||
printf("<%s>\n", t);
|
||||
free(t);
|
||||
|
||||
a = strv_new("FOO=BAR", "WALDO=WALDO", "WALDO=", "PIEP", "SCHLUMPF=SMURF", NULL);
|
||||
b = strv_new("FOO=KKK", "FOO=", "PIEP=", "SCHLUMPF=SMURFF", "NANANANA=YES", NULL);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user