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 <p...@nwl.cc>
---
 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

Reply via email to