]> git.ipfire.org Git - thirdparty/iptables.git/commitdiff
xtables: Align effect of -4/-6 options with legacy
authorPhil Sutter <phil@nwl.cc>
Fri, 21 Feb 2020 12:18:32 +0000 (13:18 +0100)
committerPhil Sutter <phil@nwl.cc>
Mon, 24 Feb 2020 11:04:20 +0000 (12:04 +0100)
Legacy iptables doesn't accept -4 or -6 if they don't match the
symlink's native family. The only exception to that is iptables-restore
which simply ignores the lines introduced by non-matching options, which
is useful to create combined dump files for feeding into both
iptables-restore and ip6tables-restore.

Signed-off-by: Phil Sutter <phil@nwl.cc>
iptables/tests/shell/testcases/iptables/0006-46-args_0 [new file with mode: 0755]
iptables/xtables.c

diff --git a/iptables/tests/shell/testcases/iptables/0006-46-args_0 b/iptables/tests/shell/testcases/iptables/0006-46-args_0
new file mode 100755 (executable)
index 0000000..17a0a01
--- /dev/null
@@ -0,0 +1,88 @@
+#!/bin/bash
+
+RC=0
+
+$XT_MULTI iptables -6 -A FORWARD -j ACCEPT
+rc=$?
+if [[ $rc -ne 2 ]]; then
+       echo "'iptables -6' returned $rc instead of 2"
+       RC=1
+fi
+
+$XT_MULTI ip6tables -4 -A FORWARD -j ACCEPT
+rc=$?
+if [[ $rc -ne 2 ]]; then
+       echo "'ip6tables -4' returned $rc instead of 2"
+       RC=1
+fi
+
+RULESET='*filter
+-4 -A FORWARD -d 10.0.0.1 -j ACCEPT
+-6 -A FORWARD -d fec0:10::1 -j ACCEPT
+COMMIT
+'
+EXPECT4='-P FORWARD ACCEPT
+-A FORWARD -d 10.0.0.1/32 -j ACCEPT'
+EXPECT6='-P FORWARD ACCEPT
+-A FORWARD -d fec0:10::1/128 -j ACCEPT'
+EXPECT_EMPTY='-P FORWARD ACCEPT'
+
+echo "$RULESET" | $XT_MULTI iptables-restore || {
+       echo "iptables-restore failed!"
+       RC=1
+}
+diff -u -Z <(echo -e "$EXPECT4") <($XT_MULTI iptables -S FORWARD) || {
+       echo "unexpected iptables ruleset"
+       RC=1
+}
+diff -u -Z <(echo -e "$EXPECT_EMPTY") <($XT_MULTI ip6tables -S FORWARD) || {
+       echo "unexpected non-empty ip6tables ruleset"
+       RC=1
+}
+
+$XT_MULTI iptables -F FORWARD
+
+echo "$RULESET" | $XT_MULTI ip6tables-restore || {
+       echo "ip6tables-restore failed!"
+       RC=1
+}
+diff -u -Z <(echo -e "$EXPECT6") <($XT_MULTI ip6tables -S FORWARD) || {
+       echo "unexpected ip6tables ruleset"
+       RC=1
+}
+diff -u -Z <(echo -e "$EXPECT_EMPTY") <($XT_MULTI iptables -S FORWARD) || {
+       echo "unexpected non-empty iptables ruleset"
+       RC=1
+}
+
+$XT_MULTI ip6tables -F FORWARD
+
+$XT_MULTI iptables -4 -A FORWARD -d 10.0.0.1 -j ACCEPT || {
+       echo "iptables failed!"
+       RC=1
+}
+diff -u -Z <(echo -e "$EXPECT4") <($XT_MULTI iptables -S FORWARD) || {
+       echo "unexpected iptables ruleset"
+       RC=1
+}
+diff -u -Z <(echo -e "$EXPECT_EMPTY") <($XT_MULTI ip6tables -S FORWARD) || {
+       echo "unexpected non-empty ip6tables ruleset"
+       RC=1
+}
+
+$XT_MULTI iptables -F FORWARD
+
+$XT_MULTI ip6tables -6 -A FORWARD -d fec0:10::1 -j ACCEPT || {
+       echo "ip6tables failed!"
+       RC=1
+}
+diff -u -Z <(echo -e "$EXPECT6") <($XT_MULTI ip6tables -S FORWARD) || {
+       echo "unexpected ip6tables ruleset"
+       RC=1
+}
+diff -u -Z <(echo -e "$EXPECT_EMPTY") <($XT_MULTI iptables -S FORWARD) || {
+       echo "unexpected non-empty iptables ruleset"
+       RC=1
+}
+
+exit $RC
index 8f9dc628d0029f26bc813fa2c611050bc73197ed..3d75a1ddacae2b0877d17849a3a6f8b1494fe210 100644 (file)
@@ -917,27 +917,22 @@ void do_parse(struct nft_handle *h, int argc, char *argv[],
                        break;
 
                case '4':
+                       if (args->family == AF_INET)
+                               break;
+
                        if (p->restore && args->family == AF_INET6)
                                return;
 
-                       if (args->family != AF_INET)
-                               exit_tryhelp(2);
-
-                       h->ops = nft_family_ops_lookup(args->family);
-                       break;
+                       exit_tryhelp(2);
 
                case '6':
+                       if (args->family == AF_INET6)
+                               break;
+
                        if (p->restore && args->family == AF_INET)
                                return;
 
-                       args->family = AF_INET6;
-                       xtables_set_nfproto(AF_INET6);
-
-                       h->ops = nft_family_ops_lookup(args->family);
-                       if (h->ops == NULL)
-                               xtables_error(PARAMETER_PROBLEM,
-                                             "Unknown family");
-                       break;
+                       exit_tryhelp(2);
 
                case 1: /* non option */
                        if (optarg[0] == '!' && optarg[1] == '\0') {