[iptables PATCH v2 23/24] xtables-restore: Allow lines without trailing newline character

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Old code in add_param_to_argv() assumed the input line would always end
with a newline character. Without it, the last word of input wasn't
recognized. Fix this by adding a final check for param.len (indicating
leftover data in buffer).

In line parsing code itself, only COMMIT line check required presence of
trailing newline. The replaced conditional is not 100% accurate as it
allows for characters after newline to be present, but since fgets() is
used this shouldn't happen anyway.

Signed-off-by: Phil Sutter <phil@xxxxxx>
---
 iptables/xshared.c         | 4 ++++
 iptables/xtables-restore.c | 4 +++-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/iptables/xshared.c b/iptables/xshared.c
index 52730d8a6d526..01709288da5dc 100644
--- a/iptables/xshared.c
+++ b/iptables/xshared.c
@@ -549,6 +549,10 @@ void add_param_to_argv(char *parsestart, int line)
 		add_argv(param.buffer, 0);
 		param.len = 0;
 	}
+	if (param.len) {
+		param.buffer[param.len] = '\0';
+		add_argv(param.buffer, 0);
+	}
 }
 
 static const char *ipv4_addr_to_string(const struct in_addr *addr,
diff --git a/iptables/xtables-restore.c b/iptables/xtables-restore.c
index e9cdf2093bfcb..d065e1a921be7 100644
--- a/iptables/xtables-restore.c
+++ b/iptables/xtables-restore.c
@@ -98,7 +98,9 @@ static void xtables_restore_parse_line(struct nft_handle *h,
 		if (verbose)
 			fputs(buffer, stdout);
 		return;
-	} else if ((strcmp(buffer, "COMMIT\n") == 0) && (p->in_table)) {
+	} else if (p->in_table &&
+		   (strncmp(buffer, "COMMIT", 6) == 0) &&
+		   (buffer[6] == '\0' || buffer[6] == '\n')) {
 		if (!p->testing) {
 			/* Commit per table, although we support
 			 * global commit at once, stick by now to
-- 
2.23.0




[Index of Archives]     [Netfitler Users]     [Berkeley Packet Filter]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux