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);

Reply via email to