From: Lennart Poettering Date: Wed, 19 Sep 2012 20:01:31 +0000 (+0200) Subject: util: fix bad strstrip() return value in normalize_env_assignment() X-Git-Tag: v190~12 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=57f3067825d9361d7487f272bfaff3b36c684c62 util: fix bad strstrip() return value in normalize_env_assignment() https://bugzilla.redhat.com/show_bug.cgi?id=858780 --- diff --git a/src/shared/util.c b/src/shared/util.c index 59c1417b4..69c9437db 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -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; } diff --git a/src/test/test-env-replace.c b/src/test/test-env-replace.c index 4b6b88477..cd596a6e1 100644 --- a/src/test/test-env-replace.c +++ b/src/test/test-env-replace.c @@ -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);