summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;
}