[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