summaryrefslogtreecommitdiff
path: root/src/helper/command.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/helper/command.c')
-rw-r--r--src/helper/command.c50
1 files changed, 29 insertions, 21 deletions
diff --git a/src/helper/command.c b/src/helper/command.c
index 44ead7cb..adaad109 100644
--- a/src/helper/command.c
+++ b/src/helper/command.c
@@ -200,25 +200,24 @@ int parse_line(char *line, char *words[], int max_words)
/* we're inside a word or quote, and reached its end*/
if (word_start)
{
- int len;
- char *word_end=p;
- /* This will handle extra whitespace within quotes */
- while (isspace(*word_start)&&(word_start<word_end))
- word_start++;
- while (isspace(*(word_end-1))&&(word_start<word_end))
- word_end--;
-
- len = word_end - word_start;
-
- if (len>0)
- {
- /* copy the word */
- memcpy(words[nwords] = malloc(len + 1), word_start, len);
- /* add terminating NUL */
- words[nwords++][len] = 0;
- }
+ int len;
+ char *word_end=p;
+
+ /* This will handle extra whitespace within quotes */
+ while (isspace(*word_start)&&(word_start<word_end))
+ word_start++;
+ while (isspace(*(word_end-1))&&(word_start<word_end))
+ word_end--;
+ len = word_end - word_start;
+
+ if (len>0)
+ {
+ /* copy the word */
+ memcpy(words[nwords] = malloc(len + 1), word_start, len);
+ /* add terminating NUL */
+ words[nwords++][len] = 0;
+ }
}
-
/* we're done parsing the line */
if (!*p)
break;
@@ -226,9 +225,9 @@ int parse_line(char *line, char *words[], int max_words)
/* skip over trailing quote or whitespace*/
if (inquote || isspace(*p))
p++;
- while (isspace(*p))
- p++;
-
+ while (isspace(*p))
+ p++;
+
inquote = 0;
word_start = 0;
}
@@ -267,14 +266,23 @@ void command_print(command_context_t *context, char *format, ...)
{
/* increase buffer until it fits the whole string */
if (!(p = realloc(buffer, size += 4096)))
+ {
+ /* gotta free up */
+ if (buffer)
+ free(buffer);
return;
+ }
buffer = p;
}
/* vsnprintf failed */
if (n < 0)
+ {
+ if (buffer)
+ free(buffer);
return;
+ }
p = buffer;