svn commit: r268492 - head/sys/netpfil/pf
Gleb Smirnoff
glebius at FreeBSD.org
Thu Jul 10 12:41:59 UTC 2014
Author: glebius
Date: Thu Jul 10 12:41:58 2014
New Revision: 268492
URL: http://svnweb.freebsd.org/changeset/base/268492
Log:
On machines with strict alignment copy pfsync_state_key from packet
on stack to avoid unaligned access.
PR: 187381
Submitted by: Lytochkin Boris <lytboris gmail.com>
Modified:
head/sys/netpfil/pf/if_pfsync.c
Modified: head/sys/netpfil/pf/if_pfsync.c
==============================================================================
--- head/sys/netpfil/pf/if_pfsync.c Thu Jul 10 12:15:02 2014 (r268491)
+++ head/sys/netpfil/pf/if_pfsync.c Thu Jul 10 12:41:58 2014 (r268492)
@@ -402,6 +402,10 @@ static int
pfsync_state_import(struct pfsync_state *sp, u_int8_t flags)
{
struct pfsync_softc *sc = V_pfsyncif;
+#ifndef __NO_STRICT_ALIGNMENT
+ struct pfsync_state_key key[2];
+#endif
+ struct pfsync_state_key *kw, *ks;
struct pf_state *st = NULL;
struct pf_state_key *skw = NULL, *sks = NULL;
struct pf_rule *r = NULL;
@@ -451,12 +455,19 @@ pfsync_state_import(struct pfsync_state
if ((skw = uma_zalloc(V_pf_state_key_z, M_NOWAIT)) == NULL)
goto cleanup;
- if (PF_ANEQ(&sp->key[PF_SK_WIRE].addr[0],
- &sp->key[PF_SK_STACK].addr[0], sp->af) ||
- PF_ANEQ(&sp->key[PF_SK_WIRE].addr[1],
- &sp->key[PF_SK_STACK].addr[1], sp->af) ||
- sp->key[PF_SK_WIRE].port[0] != sp->key[PF_SK_STACK].port[0] ||
- sp->key[PF_SK_WIRE].port[1] != sp->key[PF_SK_STACK].port[1]) {
+#ifndef __NO_STRICT_ALIGNMENT
+ bcopy(&sp->key, key, sizeof(struct pfsync_state_key) * 2);
+ kw = &key[PF_SK_WIRE];
+ ks = &key[PF_SK_STACK];
+#else
+ kw = &sp->key[PF_SK_WIRE];
+ ks = &sp->key[PF_SK_STACK];
+#endif
+
+ if (PF_ANEQ(&kw->addr[0], &ks->addr[0], sp->af) ||
+ PF_ANEQ(&kw->addr[1], &ks->addr[1], sp->af) ||
+ kw->port[0] != ks->port[0] ||
+ kw->port[1] != ks->port[1]) {
sks = uma_zalloc(V_pf_state_key_z, M_NOWAIT);
if (sks == NULL)
goto cleanup;
@@ -468,18 +479,18 @@ pfsync_state_import(struct pfsync_state
pfsync_alloc_scrub_memory(&sp->dst, &st->dst))
goto cleanup;
- /* copy to state key(s) */
- skw->addr[0] = sp->key[PF_SK_WIRE].addr[0];
- skw->addr[1] = sp->key[PF_SK_WIRE].addr[1];
- skw->port[0] = sp->key[PF_SK_WIRE].port[0];
- skw->port[1] = sp->key[PF_SK_WIRE].port[1];
+ /* Copy to state key(s). */
+ skw->addr[0] = kw->addr[0];
+ skw->addr[1] = kw->addr[1];
+ skw->port[0] = kw->port[0];
+ skw->port[1] = kw->port[1];
skw->proto = sp->proto;
skw->af = sp->af;
if (sks != skw) {
- sks->addr[0] = sp->key[PF_SK_STACK].addr[0];
- sks->addr[1] = sp->key[PF_SK_STACK].addr[1];
- sks->port[0] = sp->key[PF_SK_STACK].port[0];
- sks->port[1] = sp->key[PF_SK_STACK].port[1];
+ sks->addr[0] = ks->addr[0];
+ sks->addr[1] = ks->addr[1];
+ sks->port[0] = ks->port[0];
+ sks->port[1] = ks->port[1];
sks->proto = sp->proto;
sks->af = sp->af;
}
More information about the svn-src-all
mailing list