diff options
author | Daniel Mack <github@zonque.org> | 2015-07-24 19:49:29 +0200 |
---|---|---|
committer | Daniel Mack <github@zonque.org> | 2015-07-24 19:49:29 +0200 |
commit | b83b298102e1abd03565052cb2bc60234e09b692 (patch) | |
tree | 84543af49bd010f6ca5ef12c4ac194cd3dfcaff5 /src | |
parent | 0b071992bbdf6a2bfdbe1a064a2f8270be8779c4 (diff) | |
parent | 14e685c29d5b317b815e3e9f056648027852b07e (diff) |
Merge pull request #704 from richardmaw-codethink/empty-arg-unquote
unquote_first_word: parse ` '' ` as an empty argument instead of no arg
Diffstat (limited to 'src')
-rw-r--r-- | src/basic/util.c | 14 | ||||
-rw-r--r-- | src/test/test-util.c | 11 |
2 files changed, 21 insertions, 4 deletions
diff --git a/src/basic/util.c b/src/basic/util.c index dc20fa9baf..7896be8788 100644 --- a/src/basic/util.c +++ b/src/basic/util.c @@ -5729,13 +5729,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)) diff --git a/src/test/test-util.c b/src/test/test-util.c index 7906c4d7bb..f43433baa1 100644 --- a/src/test/test-util.c +++ b/src/test/test-util.c @@ -1689,6 +1689,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) { |