Patchwork [iptables-nftables,2/2] nft: pass ipt_entry to ->save_firewall hook

login
register
mail settings
Submitter Pablo Neira
Date Oct. 8, 2013, 9:11 a.m.
Message ID <1381223479-1157-2-git-send-email-pablo@netfilter.org>
Download mbox | patch
Permalink /patch/281372/
State Accepted
Headers show

Comments

Pablo Neira - Oct. 8, 2013, 9:11 a.m.
The extension needs the ipt_entry not to crash. Since cs->fw
actually points to an union that also contains cs->fw6, just
pass cs->fw to make it work.

This fixes:

-A INPUT -p tcp -m multiport --ports 1,2,3,4,6,7,8,9,10,11,12,13,14,15

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
 iptables/nft-shared.c |    4 ++--
 iptables/nft.c        |    8 +++++---
 2 files changed, 7 insertions(+), 5 deletions(-)

Patch

diff --git a/iptables/nft-shared.c b/iptables/nft-shared.c
index 25cb177..ebcb969 100644
--- a/iptables/nft-shared.c
+++ b/iptables/nft-shared.c
@@ -633,14 +633,14 @@  void print_matches_and_target(struct iptables_command_state *cs,
 
 	for (matchp = cs->matches; matchp; matchp = matchp->next) {
 		if (matchp->match->print != NULL) {
-			matchp->match->print(NULL, matchp->match->m,
+			matchp->match->print(&cs->fw, matchp->match->m,
 					     format & FMT_NUMERIC);
 		}
 	}
 
 	if (cs->target != NULL) {
 		if (cs->target->print != NULL) {
-			cs->target->print(NULL, cs->target->t,
+			cs->target->print(&cs->fw, cs->target->t,
 					  format & FMT_NUMERIC);
 		}
 	}
diff --git a/iptables/nft.c b/iptables/nft.c
index 50e756b..01e0264 100644
--- a/iptables/nft.c
+++ b/iptables/nft.c
@@ -1040,8 +1040,10 @@  nft_rule_print_save(const struct iptables_command_state *cs,
 		} else
 			printf("-m %s", matchp->match->name);
 
-		if (matchp->match->save != NULL)
-			matchp->match->save(NULL, matchp->match->m);
+		if (matchp->match->save != NULL) {
+			/* cs->fw union makes the trick */
+			matchp->match->save(&cs->fw, matchp->match->m);
+		}
 		printf(" ");
 	}
 
@@ -1052,7 +1054,7 @@  nft_rule_print_save(const struct iptables_command_state *cs,
 			printf("-j %s", cs->jumpto);
 
 		if (cs->target->save != NULL)
-			cs->target->save(NULL, cs->target->t);
+			cs->target->save(&cs->fw, cs->target->t);
 	} else if (strlen(cs->jumpto) > 0)
 		printf("-%c %s", ip_flags & IPT_F_GOTO ? 'g' : 'j',
 								cs->jumpto);