]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
unquote_first_word: parse ` '' ` as an empty argument instead of no argument 704/head
authorRichard Maw <richard.maw@codethink.co.uk>
Fri, 24 Jul 2015 09:29:46 +0000 (09:29 +0000)
committerRichard Maw <richard.maw@codethink.co.uk>
Fri, 24 Jul 2015 09:29:46 +0000 (09:29 +0000)
src/basic/util.c
src/test/test-util.c

index a45f5f8e53055c20213f5fcba160b07945820ae9..7d85324d0786021ec158a431318c2476401b1a9e 100644 (file)
@@ -5379,13 +5379,19 @@ int unquote_first_word(const char **p, char **ret, UnquoteFlags flags) {
                 case VALUE:
                         if (c == 0)
                                 goto finish;
-                        else if (c == '\'')
+                        else if (c == '\'') {
+                                if (!GREEDY_REALLOC(s, allocated, sz+1))
+                                        return -ENOMEM;
+
                                 state = SINGLE_QUOTE;
-                        else if (c == '\\')
+                        else if (c == '\\')
                                 state = VALUE_ESCAPE;
-                        else if (c == '\"')
+                        else if (c == '\"') {
+                                if (!GREEDY_REALLOC(s, allocated, sz+1))
+                                        return -ENOMEM;
+
                                 state = DOUBLE_QUOTE;
-                        else if (strchr(WHITESPACE, c))
+                        else if (strchr(WHITESPACE, c))
                                 state = SPACE;
                         else {
                                 if (!GREEDY_REALLOC(s, allocated, sz+2))
index 72fbc345c276a115b29859187fd314caf53ebe8c..ab40f0076b5378a25baa9d80b54427f2deea4841 100644 (file)
@@ -1518,6 +1518,17 @@ static void test_unquote_first_word(void) {
         assert_se(streq(t, "\\w+\b"));
         free(t);
         assert_se(p == original + 5);
+
+        p = original = "-N ''";
+        assert_se(unquote_first_word(&p, &t, UNQUOTE_CUNESCAPE) > 0);
+        assert_se(streq(t, "-N"));
+        free(t);
+        assert_se(p == original + 3);
+
+        assert_se(unquote_first_word(&p, &t, UNQUOTE_CUNESCAPE) > 0);
+        assert_se(streq(t, ""));
+        free(t);
+        assert_se(p == original + 5);
 }
 
 static void test_unquote_first_word_and_warn(void) {