DragonFlyBSD Kernel Audit
DF-0391 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/net/pf/pf_norm.c b/sys/net/pf/pf_norm.c
--- a/sys/net/pf/pf_norm.c
+++ b/sys/net/pf/pf_norm.c
@@ -660,10 +660,15 @@
 				 */
 				*m0 = m_dup(m, M_NOWAIT);
 				/* From KAME Project : We have missed this! */
-				m_adj(*m0, (h->ip_hl << 2) -
-				    (*m0)->m_pkthdr.len);
+				/* DF-0391: the NULL check must precede the
+				 * m_adj() argument expression, which otherwise
+				 * evaluates (*m0)->m_pkthdr.len -- a NULL
+				 * dereference -- before the guard on the old
+				 * next line. */
 				if (*m0 == NULL)
 					goto no_mem;
+				m_adj(*m0, (h->ip_hl << 2) -
+				    (*m0)->m_pkthdr.len);
 				KASSERT(((*m0)->m_next == NULL),
 				    ("(*m0)->m_next != NULL: %s",
 				    __func__));