svn commit: r238421 - projects/pf/head/sys/contrib/pf/net

Gleb Smirnoff glebius at FreeBSD.org
Fri Jul 13 11:08:37 UTC 2012


Author: glebius
Date: Fri Jul 13 11:08:37 2012
New Revision: 238421
URL: http://svn.freebsd.org/changeset/base/238421

Log:
  Remove UMA init method for key zone, and instead do all initialization
  after uma_zalloc(). If a key was first allocated for IPv6 state, then
  freed and reallocated for IPv4, then we'd got non-zero values in not
  used for IPv4 fields, this bcmp() would fail on key lookup.
  
  Reported & tested by:	flo

Modified:
  projects/pf/head/sys/contrib/pf/net/pf.c

Modified: projects/pf/head/sys/contrib/pf/net/pf.c
==============================================================================
--- projects/pf/head/sys/contrib/pf/net/pf.c	Fri Jul 13 09:43:45 2012	(r238420)
+++ projects/pf/head/sys/contrib/pf/net/pf.c	Fri Jul 13 11:08:37 2012	(r238421)
@@ -259,7 +259,6 @@ static void		 pf_detach_state(struct pf_
 static int		 pf_state_key_attach(struct pf_state_key *,
 			    struct pf_state_key *, struct pf_state *);
 static void		 pf_state_key_detach(struct pf_state *, int);
-static int		 pf_state_key_ini(void *, int, int);
 static u_int32_t	 pf_tcp_iss(struct pf_pdesc *);
 static int		 pf_test_rule(struct pf_rule **, struct pf_state **,
 			    int, struct pfi_kif *, struct mbuf *, int,
@@ -740,7 +739,7 @@ pf_initialize()
         uma_zone_set_max(V_pf_state_z, PFSTATE_HIWAT);
 
 	V_pf_state_key_z = uma_zcreate("pf state keys",
-	    sizeof(struct pf_state_key), NULL, NULL, pf_state_key_ini, NULL,
+	    sizeof(struct pf_state_key), NULL, NULL, NULL, NULL,
 	    UMA_ALIGN_PTR, 0);
 	V_pf_keyhash = malloc(V_pf_hashsize * sizeof(struct pf_keyhash),
 	    M_PFHASH, M_WAITOK | M_ZERO);
@@ -1043,24 +1042,13 @@ pf_state_key_detach(struct pf_state *s, 
 	}
 }
 
-static int
-pf_state_key_ini(void *mem, int size, int flags)
-{
-	struct pf_state_key *sk = mem;
-
-	bzero(sk, sizeof(*sk));
-	TAILQ_INIT(&sk->states[PF_SK_WIRE]);
-	TAILQ_INIT(&sk->states[PF_SK_STACK]);
-	return (0);
-}
-
 struct pf_state_key *
 pf_state_key_setup(struct pf_pdesc *pd, struct pf_addr *saddr,
 	struct pf_addr *daddr, u_int16_t sport, u_int16_t dport)
 {
 	struct pf_state_key *sk;
 
-	sk = uma_zalloc(V_pf_state_key_z, M_NOWAIT);
+	sk = uma_zalloc(V_pf_state_key_z, M_ZERO | M_NOWAIT);
 	if (sk == NULL)
 		return (NULL);
 
@@ -1071,6 +1059,9 @@ pf_state_key_setup(struct pf_pdesc *pd, 
 	sk->proto = pd->proto;
 	sk->af = pd->af;
 
+	TAILQ_INIT(&sk->states[PF_SK_WIRE]);
+	TAILQ_INIT(&sk->states[PF_SK_STACK]);
+
 	return (sk);
 }
 


More information about the svn-src-projects mailing list