summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNathan Angelacos <nangel@alpinelinux.org>2013-06-28 19:41:31 -0700
committerNathan Angelacos <nangel@alpinelinux.org>2013-06-28 19:41:31 -0700
commit748da159164b2c45c95f6c019a7ba36251cea933 (patch)
treeedea708d1183dcdae3b02e95ddffd3b1d3a97390 /src
parentb1bed843f31c2d59303ebea5e14f36df55e78262 (diff)
downloadhaserl-748da159164b2c45c95f6c019a7ba36251cea933.tar.bz2
haserl-748da159164b2c45c95f6c019a7ba36251cea933.tar.xz
Fix segfault when the first parameter is a quoted string, or a null string
modified: ChangeLog modified: configure.ac modified: src/common.c
Diffstat (limited to 'src')
-rw-r--r--src/common.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/common.c b/src/common.c
index 319891d..168a682 100644
--- a/src/common.c
+++ b/src/common.c
@@ -78,13 +78,14 @@ argc_argv (char *instr, argv_t ** argv, char *commentstr)
len = strlen (instr);
pos = 0;
+ char quoted = 0;
while (pos < len)
{
- // printf ("%3d of %3d: %s\n", pos, len, instr);
+ // printf ("%3d of %3d: %s\n", pos, len, instr);
+
/* Comments are really, really special */
-
if ((state == WHITESPACE) && (strchr (commentstr, *instr)))
{
while ((*instr != '\n') && (*instr != '\0'))
@@ -105,11 +106,10 @@ argc_argv (char *instr, argv_t ** argv, char *commentstr)
{
quote = *instr;
state = TOKENSTART;
+ quoted = -1;
if (*(instr + 1) == quote)
{ /* special case for NULL quote */
- quote = '\0';
*instr = '\0';
- argv_array[arg_count].quoted = -1;
}
else
{
@@ -119,11 +119,9 @@ argc_argv (char *instr, argv_t ** argv, char *commentstr)
}
else
{ /* WORDSPACE, so quotes end or quotes within quotes */
-
/* Is it the same kind of quote? */
- if (*instr == quote)
+ if ( (*instr == quote) && quoted )
{
- argv_array[arg_count - 1].quoted = -1;
quote = '\0';
*instr = '\0';
state = WHITESPACE;
@@ -189,14 +187,17 @@ argc_argv (char *instr, argv_t ** argv, char *commentstr)
return (-1);
}
argv_array[arg_count - 1].string = instr;
- argv_array[arg_count].quoted = 0;
+ argv_array[arg_count - 1].quoted = quoted;
state = WORDSPACE;
+ quoted = 0;
}
instr++;
pos++;
}
+ if ( arg_count == 0 ) return (0);
+
argv_array[arg_count].string = NULL;
*argv = argv_array;
return (arg_count);
@@ -337,14 +338,15 @@ main ()
strcpy (string,
- "\\This\\ string will be '' \"separated into\" \"'\\\"'\" ' 15 ' elements.\n"
+ "\\This\\ string will be '' \"separated into\" \"'\\\"'\" ' 16 ' elements.\n"
"' including a multi-line\n"
"element' with a comment. # This should not be parsed\n"
";Nor should this\n" "The End.");
- printf ("%s\n", string);
argc = argc_argv (string, &argv, "#;");
+ printf ("%s\n", string);
+
for (count = 0; count < argc; count++)
{
printf ("%03d: [%s] ", count, argv[count].string, "");