summaryrefslogtreecommitdiff
path: root/src/basic/util.c
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@codethink.co.uk>2015-06-19 16:38:06 +0000
committerRichard Maw <richard.maw@codethink.co.uk>2015-08-07 15:50:42 +0000
commit53f0db71771bf757b6b429525a4e5db3dcf3afef (patch)
tree3e6d260d7220dd3fe2fd71fab44193a7bd9ee6ff /src/basic/util.c
parent4b1c17535115b70f4ddf4bf5850049b885a40173 (diff)
unquote_first_word: set *p=NULL on termination
To add a flag to allow an empty string to be parsed as an argument, we need to be able to distinguish between the end of the string, and after the end of the string, so when we *do* reach the end, let's set *p to this state.
Diffstat (limited to 'src/basic/util.c')
-rw-r--r--src/basic/util.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/basic/util.c b/src/basic/util.c
index d4d3d3c83a..bb7ec007d7 100644
--- a/src/basic/util.c
+++ b/src/basic/util.c
@@ -5715,9 +5715,12 @@ int unquote_first_word(const char **p, char **ret, UnquoteFlags flags) {
} state = START;
assert(p);
- assert(*p);
assert(ret);
+ /* Bail early if called after last value or with no input */
+ if (!*p)
+ goto finish_force_terminate;
+
/* Parses the first word of a string, and returns it in
* *ret. Removes all quotes in the process. When parsing fails
* (because of an uneven number of quotes or similar), leaves
@@ -5730,7 +5733,7 @@ int unquote_first_word(const char **p, char **ret, UnquoteFlags flags) {
case START:
if (c == 0)
- goto finish;
+ goto finish_force_terminate;
else if (strchr(WHITESPACE, c))
break;
@@ -5739,7 +5742,7 @@ int unquote_first_word(const char **p, char **ret, UnquoteFlags flags) {
case VALUE:
if (c == 0)
- goto finish;
+ goto finish_force_terminate;
else if (c == '\'') {
if (!GREEDY_REALLOC(s, allocated, sz+1))
return -ENOMEM;
@@ -5766,7 +5769,7 @@ int unquote_first_word(const char **p, char **ret, UnquoteFlags flags) {
case SINGLE_QUOTE:
if (c == 0) {
if (flags & UNQUOTE_RELAX)
- goto finish;
+ goto finish_force_terminate;
return -EINVAL;
} else if (c == '\'')
state = VALUE;
@@ -5814,10 +5817,10 @@ int unquote_first_word(const char **p, char **ret, UnquoteFlags flags) {
* mode, UNQUOTE_CUNESCAP_RELAX mode does not allow them.
*/
s[sz++] = '\\';
- goto finish;
+ goto finish_force_terminate;
}
if (flags & UNQUOTE_RELAX)
- goto finish;
+ goto finish_force_terminate;
return -EINVAL;
}
@@ -5861,8 +5864,11 @@ end_escape:
(*p) ++;
}
+finish_force_terminate:
+ *p = NULL;
finish:
if (!s) {
+ *p = NULL;
*ret = NULL;
return 0;
}