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