diff --git a/sys/netpfil/pf/pf.c b/sys/netpfil/pf/pf.c --- a/sys/netpfil/pf/pf.c +++ b/sys/netpfil/pf/pf.c @@ -8415,6 +8415,12 @@ if (m->m_flags & M_SKIP_FIREWALL) return (PF_PASS); + if (__predict_false(! M_WRITABLE(*m0))) { + m = *m0 = m_unshare(*m0, M_NOWAIT); + if (*m0 == NULL) + return (PF_DROP); + } + /* Stateless! */ return (pf_test_eth_rule(dir, kif, m0)); } @@ -8553,6 +8559,12 @@ return (PF_PASS); } + if (__predict_false(! M_WRITABLE(*m0))) { + m = *m0 = m_unshare(*m0, M_NOWAIT); + if (*m0 == NULL) + return (PF_DROP); + } + memset(&pd, 0, sizeof(pd)); TAILQ_INIT(&pd.sctp_multihome_jobs); if (default_actions != NULL) @@ -9147,6 +9159,12 @@ return (PF_DROP); } + if (__predict_false(! M_WRITABLE(*m0))) { + m = *m0 = m_unshare(*m0, M_NOWAIT); + if (*m0 == NULL) + return (PF_DROP); + } + memset(&pd, 0, sizeof(pd)); TAILQ_INIT(&pd.sctp_multihome_jobs); if (default_actions != NULL)