summaryrefslogtreecommitdiffstats
path: root/iptables-restore.c
diff options
context:
space:
mode:
Diffstat (limited to 'iptables-restore.c')
-rw-r--r--iptables-restore.c47
1 files changed, 15 insertions, 32 deletions
diff --git a/iptables-restore.c b/iptables-restore.c
index 9b8563ad..89acd73d 100644
--- a/iptables-restore.c
+++ b/iptables-restore.c
@@ -301,9 +301,8 @@ main(int argc, char *argv[])
char *parsestart;
/* the parser */
- char *curchar;
+ char *param_start, *curchar;
int quote_open;
- int param_len;
/* reset the newargv */
newargc = 0;
@@ -350,11 +349,9 @@ main(int argc, char *argv[])
* longer a real hacker, but I can live with that */
quote_open = 0;
- param_len = 0;
+ param_start = parsestart;
for (curchar = parsestart; *curchar; curchar++) {
- char param_buffer[1024];
-
if (*curchar == '"') {
/* quote_open cannot be true if there
* was no previous character. Thus,
@@ -363,27 +360,30 @@ main(int argc, char *argv[])
*(curchar-1) != '\\') {
quote_open = 0;
*curchar = ' ';
- } else if (!quote_open) {
+ } else {
quote_open = 1;
- continue;
+ param_start++;
}
}
if (*curchar == ' '
|| *curchar == '\t'
|| * curchar == '\n') {
+ char param_buffer[1024];
+ int param_len = curchar-param_start;
- if (quote_open) {
- param_buffer[param_len++] =
- *curchar;
+ if (quote_open)
continue;
- }
if (!param_len) {
/* two spaces? */
+ param_start++;
continue;
}
-
- param_buffer[param_len] = '\0';
+
+ /* end of one parameter */
+ strncpy(param_buffer, param_start,
+ param_len);
+ *(param_buffer+param_len) = '\0';
/* check if table name specified */
if (!strncmp(param_buffer, "-t", 3)
@@ -395,26 +395,9 @@ main(int argc, char *argv[])
}
add_argv(param_buffer);
- param_len = 0;
+ param_start += param_len + 1;
} else {
- /* Skip backslash that escapes quote:
- * the standard input does not require
- * escaping. However, the output
- * generated by iptables-save
- * introduces bashlash to keep
- * consistent with iptables
- */
- if (quote_open &&
- *curchar == '\\' &&
- *(curchar+1) == '"')
- continue;
-
- /* regular character, copy to buffer */
- param_buffer[param_len++] = *curchar;
-
- if (param_len >= sizeof(param_buffer))
- exit_error(PARAMETER_PROBLEM,
- "Parameter too long!");
+ /* regular character, skip */
}
}