summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2012-09-19 22:01:31 +0200
committerLennart Poettering <lennart@poettering.net>2012-09-19 22:01:31 +0200
commit57f3067825d9361d7487f272bfaff3b36c684c62 (patch)
tree5bd99a4794edbe89687af74754b29de8ecc27857 /src/shared
parent93e4c84bb3d6169a02a5ddd1cd0690ad64d20cd8 (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')
-rw-r--r--src/shared/util.c40
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;
}