chiark / gitweb /
util: fix bad strstrip() return value in normalize_env_assignment()
authorLennart Poettering <lennart@poettering.net>
Wed, 19 Sep 2012 20:01:31 +0000 (22:01 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 19 Sep 2012 20:01:31 +0000 (22:01 +0200)
https://bugzilla.redhat.com/show_bug.cgi?id=858780

src/shared/util.c
src/test/test-env-replace.c

index 59c1417b44615443d5a360339acc3171c5cd1e56..69c9437db83a826826435bcddbb04603cab02100 100644 (file)
@@ -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;
 }
 
index 4b6b8847794e714b199a00650d7afa265f1371dc..cd596a6e168533ec84a32361a7a15aff0905fc94 100644 (file)
@@ -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);