Module Name: src
Committed By: christos
Date: Mon Jun 16 12:38:32 UTC 2014
Modified Files:
src/sys/external/bsd/ipf/netinet: fil.c
Log Message:
Darren Reed: #550 filter rule list corrupted with inserted rules
To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/external/bsd/ipf/netinet/fil.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/external/bsd/ipf/netinet/fil.c
diff -u src/sys/external/bsd/ipf/netinet/fil.c:1.14 src/sys/external/bsd/ipf/netinet/fil.c:1.15
--- src/sys/external/bsd/ipf/netinet/fil.c:1.14 Thu Mar 20 16:43:12 2014
+++ src/sys/external/bsd/ipf/netinet/fil.c Mon Jun 16 08:38:32 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: fil.c,v 1.14 2014/03/20 20:43:12 christos Exp $ */
+/* $NetBSD: fil.c,v 1.15 2014/06/16 12:38:32 christos Exp $ */
/*
* Copyright (C) 2012 by Darren Reed.
@@ -138,7 +138,7 @@ extern struct timeout ipf_slowtimer_ch;
#if !defined(lint)
#if defined(__NetBSD__)
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fil.c,v 1.14 2014/03/20 20:43:12 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fil.c,v 1.15 2014/06/16 12:38:32 christos Exp $");
#else
static const char sccsid[] = "@(#)fil.c 1.36 6/5/96 (C) 1993-2000 Darren Reed";
static const char rcsid[] = "@(#)Id: fil.c,v 1.1.1.2 2012/07/22 13:45:07 darrenr Exp $";
@@ -3787,6 +3787,8 @@ memstr(const char *src, char *dst, size_
}
return s;
}
+
+
/* ------------------------------------------------------------------------ */
/* Function: ipf_fixskip */
/* Returns: Nil */
@@ -4357,7 +4359,15 @@ frrequest(ipf_main_softc_t *softc, int u
fp = f;
f = NULL;
+ fp->fr_next = NULL;
fp->fr_dnext = NULL;
+ fp->fr_pnext = NULL;
+ fp->fr_pdnext = NULL;
+ fp->fr_grp = NULL;
+ fp->fr_grphead = NULL;
+ fp->fr_icmpgrp = NULL;
+ fp->fr_isc = (void *)-1;
+ fp->fr_ptr = NULL;
fp->fr_ref = 0;
fp->fr_flags |= FR_COPIED;
} else {
@@ -4860,7 +4870,9 @@ frrequest(ipf_main_softc_t *softc, int u
if (f->fr_collect > fp->fr_collect)
break;
ftail = &f->fr_next;
+ fprev = ftail;
}
+ ftail = fprev;
f = NULL;
ptr = NULL;
} else if (req == (ioctlcmd_t)SIOCINAFR ||
@@ -4951,6 +4963,8 @@ frrequest(ipf_main_softc_t *softc, int u
fp->fr_ref = 1;
fp->fr_pnext = ftail;
fp->fr_next = *ftail;
+ if (fp->fr_next != NULL)
+ fp->fr_next->fr_pnext = &fp->fr_next;
*ftail = fp;
if (addrem == 0)
ipf_fixskip(ftail, fp, 1);