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;
        }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to