svn commit: r220796 - head/sys/netinet/ipfw

Gleb Smirnoff glebius at FreeBSD.org
Mon Apr 18 18:22:11 UTC 2011


Author: glebius
Date: Mon Apr 18 18:22:10 2011
New Revision: 220796
URL: http://svn.freebsd.org/changeset/base/220796

Log:
  Pullup up to TCP header length before matching against 'tcpopts'.
  
  PR:		kern/156180
  Reviewed by:	luigi

Modified:
  head/sys/netinet/ipfw/ip_fw2.c

Modified: head/sys/netinet/ipfw/ip_fw2.c
==============================================================================
--- head/sys/netinet/ipfw/ip_fw2.c	Mon Apr 18 18:18:07 2011	(r220795)
+++ head/sys/netinet/ipfw/ip_fw2.c	Mon Apr 18 18:22:10 2011	(r220796)
@@ -913,9 +913,10 @@ ipfw_chk(struct ip_fw_args *args)
  * pointer might become stale after other pullups (but we never use it
  * this way).
  */
-#define PULLUP_TO(_len, p, T)					\
+#define PULLUP_TO(_len, p, T)	PULLUP_LEN(_len, p, sizeof(T))
+#define PULLUP_LEN(_len, p, T)					\
 do {								\
-	int x = (_len) + sizeof(T);				\
+	int x = (_len) + T;					\
 	if ((m)->m_len < x) {					\
 		args->m = m = m_pullup(m, x);			\
 		if (m == NULL)					\
@@ -1600,6 +1601,7 @@ do {								\
 				break;
 
 			case O_TCPOPTS:
+				PULLUP_LEN(hlen, ulp, (TCP(ulp)->th_off << 2));
 				match = (proto == IPPROTO_TCP && offset == 0 &&
 				    tcpopts_match(TCP(ulp), cmd));
 				break;
@@ -2233,6 +2235,7 @@ do {								\
 			}
 
 		}	/* end of inner loop, scan opcodes */
+#undef PULLUP_LEN
 
 		if (done)
 			break;


More information about the svn-src-all mailing list