[netfilter-cvslog] r4347 - trunk/nfsim/core
rusty at netfilter.org
rusty at netfilter.org
Wed Oct 12 11:37:06 CEST 2005
Author: rusty at netfilter.org
Date: 2005-10-12 11:37:04 +0200 (Wed, 12 Oct 2005)
New Revision: 4347
Modified:
trunk/nfsim/core/tui.c
Log:
Fix out-by-one error (thanks to Max Kellerman for finding)
Modified: trunk/nfsim/core/tui.c
===================================================================
--- trunk/nfsim/core/tui.c 2005-10-11 11:18:41 UTC (rev 4346)
+++ trunk/nfsim/core/tui.c 2005-10-12 09:37:04 UTC (rev 4347)
@@ -321,36 +321,50 @@
return escape(str, used);
}
+static char *append_char(char **argv, unsigned int argc, char c)
+{
+ if (!argv[argc])
+ return talloc_asprintf(argv, "%c", c);
+ return talloc_asprintf_append(argv[argc], "%c", c);
+}
+
+static char *append_string(char **argv, unsigned int argc, const char *str)
+{
+ if (!argv[argc])
+ return talloc_asprintf(argv, "%s", str);
+ return talloc_asprintf_append(argv[argc], "%s", str);
+}
+
static void process_line(char *line, unsigned int off)
{
unsigned int argc, i;
- bool prevspace = true;
char **argv;
if (tui_echo_commands)
printf("%u:%s\n", tui_linenum, line + off);
/* Talloc argv off line so commands can use it for auto-cleanup. */
- argv = talloc_array(line, char *, TUI_MAX_ARGS+1);
+ argv = talloc_zero_array(line, char *, TUI_MAX_ARGS+1);
argc = 0;
for (i = off; line[i]; i++) {
if (isspace(line[i])) {
- line[i] = '\0';
- prevspace = true;
+ /* If anything in this arg, move to next. */
+ if (argv[argc])
+ argc++;
} else if (line[i] == '`') {
- /* FIXME: Assumes ` forms arg by itself. */
- argv[argc++] = backquote(line, &i);
- } else if (prevspace) {
+ char *inside = backquote(line, &i);
+ argv[argc] = append_string(argv, argc, inside);
+ } else {
/* If it is a comment, stop before we process `` */
- if (argc == 0 && line[i] == '#')
+ if (!argv[0] && line[i] == '#')
goto out;
- argv[argc++] = line+i;
- prevspace = false;
+
+ argv[argc] = append_char(argv, argc, line[i]);
}
}
- if (argc > 0) {
- argv[argc] = NULL;
+ if (argv[0]) {
+ argv[++argc] = NULL;
tui_do_command(argc, argv, tui_abort_on_fail);
}
More information about the netfilter-cvslog
mailing list