DragonFlyBSD Kernel Audit
DF-0264 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/net/pf/pf.c b/sys/net/pf/pf.c
--- a/sys/net/pf/pf.c
+++ b/sys/net/pf/pf.c
@@ -6620,7 +6620,11 @@
 			log = action != PF_PASS;
 			goto done;
 		}
-		pd.p_len = pd.tot_len - off - (th.th_off << 2);
+		{ int _optlen = (th.th_off << 2);
+		  if (_optlen > pd.tot_len - off)
+			  pd.p_len = 0;
+		  else
+			  pd.p_len = pd.tot_len - off - _optlen; }
 #ifdef ALTQ
 		if ((th.th_flags & TH_ACK) && pd.p_len == 0)
 			pqid = 1;
@@ -7021,7 +7025,11 @@
 			log = action != PF_PASS;
 			goto done;
 		}
-		pd.p_len = pd.tot_len - off - (th.th_off << 2);
+		{ int _optlen = (th.th_off << 2);
+		  if (_optlen > pd.tot_len - off)
+			  pd.p_len = 0;
+		  else
+			  pd.p_len = pd.tot_len - off - _optlen; }
 		action = pf_normalize_tcp(dir, kif, m, 0, off, h, &pd);
 		if (action == PF_DROP)
 			goto done;