libss: fix memory leak if realloc() fails in ss_parse()

Addresses-Coverity-Id: #709491

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
maint-test
Theodore Ts'o 2014-01-07 09:36:49 -05:00
parent 56087556e1
commit 1fc70c168c
1 changed files with 13 additions and 5 deletions

View File

@ -45,7 +45,7 @@ enum parse_mode { WHITESPACE, TOKEN, QUOTED_STRING };
char **ss_parse(int sci_idx, register char *line_ptr, int *argc_ptr)
{
register char **argv, *cp;
register char **argv, **new_argv, *cp;
register int argc;
register enum parse_mode parse_mode;
@ -78,7 +78,13 @@ char **ss_parse(int sci_idx, register char *line_ptr, int *argc_ptr)
/* go to quoted-string mode */
parse_mode = QUOTED_STRING;
cp = line_ptr++;
argv = NEW_ARGV (argv, argc);
new_argv = NEW_ARGV (argv, argc);
if (new_argv == NULL) {
free(argv);
*argc_ptr = 0;
return NULL;
}
argv = new_argv;
argv[argc++] = cp;
argv[argc] = NULL;
}
@ -86,11 +92,13 @@ char **ss_parse(int sci_idx, register char *line_ptr, int *argc_ptr)
/* random-token mode */
parse_mode = TOKEN;
cp = line_ptr;
argv = NEW_ARGV (argv, argc);
new_argv = NEW_ARGV (argv, argc);
if (argv == NULL) {
*argc_ptr = errno;
return argv;
free(argv);
*argc_ptr = 0;
return NULL;
}
argv = new_argv;
argv[argc++] = line_ptr;
argv[argc] = NULL;
}