diff options
author | Lennart Poettering <lennart@poettering.net> | 2012-09-19 22:01:31 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2012-09-19 22:01:31 +0200 |
commit | 57f3067825d9361d7487f272bfaff3b36c684c62 (patch) | |
tree | 5bd99a4794edbe89687af74754b29de8ecc27857 /src/shared/util.c | |
parent | 93e4c84bb3d6169a02a5ddd1cd0690ad64d20cd8 (diff) |
util: fix bad strstrip() return value in normalize_env_assignment()
https://bugzilla.redhat.com/show_bug.cgi?id=858780
Diffstat (limited to 'src/shared/util.c')
-rw-r--r-- | src/shared/util.c | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/src/shared/util.c b/src/shared/util.c index 59c1417b44..69c9437db8 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; } |