[PATCH 2.4] netfilter refcount fix

From: Harald Welte (laforge@netfilter.org)
Date: Fri Jul 25 2003 - 15:51:06 EST


Hi Dave!

This is the 7th of a set of bugfixes (all tested against 2.4.22-pre7).
You might need to apply them incrementally (didn't test it in a
different order). You will receive 2.6 merges of those patches soon.

Author: Patrick McHardy <kaber@trash.net>

Drop reference to conntrack after removing confirmed expectation

Please apply,

diff -Nru --exclude .depend --exclude '*.o' --exclude '*.ko' --exclude '*.ver' --exclude '.*.flags' --exclude '*.orig' --exclude '*.rej' --exclude '*.cmd' --exclude '*.mod.c' --exclude '*~' linux-2.4.22-pre7-plain/net/ipv4/netfilter/ip_conntrack_core.c linux-2.4.22-pre7-nfsubm/net/ipv4/netfilter/ip_conntrack_core.c
--- linux-2.4.22-pre7-plain/net/ipv4/netfilter/ip_conntrack_core.c 2003-07-19 10:12:19.000000000 +0200
+++ linux-2.4.22-pre7-nfsubm/net/ipv4/netfilter/ip_conntrack_core.c 2003-07-19 10:37:17.000000000 +0200
@@ -257,7 +257,7 @@
 }
 
 /* delete all unconfirmed expectations for this conntrack */
-static void remove_expectations(struct ip_conntrack *ct)
+static void remove_expectations(struct ip_conntrack *ct, int drop_refcount)
 {
         struct list_head *exp_entry, *next;
         struct ip_conntrack_expect *exp;
@@ -272,8 +272,11 @@
                  * the un-established ones only */
                 if (exp->sibling) {
                         DEBUGP("remove_expectations: skipping established %p of %p\n", exp->sibling, ct);
- /* Indicate that this expectations parent is dead */
- exp->expectant = NULL;
+ if (drop_refcount) {
+ /* Indicate that this expectations parent is dead */
+ ip_conntrack_put(exp->expectant);
+ exp->expectant = NULL;
+ }
                         continue;
                 }
 
@@ -298,7 +301,7 @@
                     &ct->tuplehash[IP_CT_DIR_REPLY]);
 
         /* Destroy all un-established, pending expectations */
- remove_expectations(ct);
+ remove_expectations(ct, 1);
 }
 
 static void
@@ -1140,7 +1143,7 @@
 {
         if (i->ctrack->helper == me) {
                 /* Get rid of any expected. */
- remove_expectations(i->ctrack);
+ remove_expectations(i->ctrack, 0);
                 /* And *then* set helper to NULL */
                 i->ctrack->helper = NULL;
         }

-- 
- Harald Welte <laforge@netfilter.org>             http://www.netfilter.org/
============================================================================
  "Fragmentation is like classful addressing -- an interesting early
   architectural error that shows how much experimentation was going
   on while IP was being designed."                    -- Paul Vixie


- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Thu Jul 31 2003 - 22:00:27 EST