Thread (3 messages) flat view 3 messages, 3 authors, 2003-09-17
STALE8376d

[PATCH] (6/6) ipvs -- get rid of skb_linearize

From: Stephen Hemminger <hidden>
Date: 2003-09-16 21:23:50

Get rid of skb_linearize warnings, by using may_pull to get the
header where needed.

diff -Nru a/net/ipv4/ipvs/ip_vs_app.c b/net/ipv4/ipvs/ip_vs_app.c
--- a/net/ipv4/ipvs/ip_vs_app.c	Tue Sep 16 14:11:17 2003
+++ b/net/ipv4/ipvs/ip_vs_app.c	Tue Sep 16 14:11:17 2003
@@ -382,6 +382,10 @@
 		return 0;
 
 	iph = skb->nh.iph;
+	if (!pskb_may_pull(skb, (iph->ihl*4)+sizeof(*th)))
+		return 0;
+
+	iph = skb->nh.iph;
 	th = (struct tcphdr *)&(((char *)iph)[iph->ihl*4]);
 
 	/*
@@ -436,6 +440,10 @@
 	 *	this ip_vs_conn.
 	 */
 	if ((app = cp->app) == NULL)
+		return 0;
+
+	iph = skb->nh.iph;
+	if (!pskb_may_pull(skb, (iph->ihl*4)+sizeof(*th)))
 		return 0;
 
 	iph = skb->nh.iph;
diff -Nru a/net/ipv4/ipvs/ip_vs_core.c b/net/ipv4/ipvs/ip_vs_core.c
--- a/net/ipv4/ipvs/ip_vs_core.c	Tue Sep 16 14:11:17 2003
+++ b/net/ipv4/ipvs/ip_vs_core.c	Tue Sep 16 14:11:17 2003
@@ -526,11 +526,11 @@
 		*skb_p = skb;
 	}
 
-	if (skb_is_nonlinear(skb)) {
-		if (skb_linearize(skb, GFP_ATOMIC) != 0)
-			return NF_DROP;
-		ip_send_check(skb->nh.iph);
-	}
+	if (!(skb = skb_share_check(skb, GFP_ATOMIC)))
+		return NF_STOLEN;
+
+	if (!pskb_may_pull(skb, sizeof(*iph) + sizeof(*icmph)))
+		return NF_DROP;
 
 	iph = skb->nh.iph;
 	ihl = iph->ihl << 2;
@@ -726,11 +726,12 @@
 	 * do final checksum checking.
 	 */
 
-	if (unlikely(cp->app && !pp->slave && skb_is_nonlinear(skb))) {
-		if (skb_linearize(skb, GFP_ATOMIC) != 0) {
+	if (unlikely(cp->app && !pp->slave)) {
+		if (!(skb = skb_share_check(skb, GFP_ATOMIC))) {
 			ip_vs_conn_put(cp);
-			return NF_DROP;
+			return NF_STOLEN;
 		}
+
 		iph = skb->nh.iph;
 		h.raw = (char*) iph + ihl;
 	}
@@ -816,12 +817,13 @@
 	int	rc;
 
 	*related = 1;
-	if (skb_is_nonlinear(skb)) {
-		if (skb_linearize(skb, GFP_ATOMIC) != 0)
-			return NF_DROP;
-		ip_send_check(skb->nh.iph);
-	}
-
+	if (!pskb_may_pull(skb, sizeof(*iph)))
+		return NF_DROP;
+	    
+	iph = skb->nh.iph;
+	if (!pskb_may_pull(skb, iph->ihl*4 + sizeof(*icmph)))
+		return NF_DROP;
+	    
 	iph = skb->nh.iph;
 	icmph = (struct icmphdr *)((char *)iph+(iph->ihl<<2));
 	len = ntohs(iph->tot_len) - (iph->ihl<<2);
diff -Nru a/net/ipv4/ipvs/ip_vs_xmit.c b/net/ipv4/ipvs/ip_vs_xmit.c
--- a/net/ipv4/ipvs/ip_vs_xmit.c	Tue Sep 16 14:11:17 2003
+++ b/net/ipv4/ipvs/ip_vs_xmit.c	Tue Sep 16 14:11:17 2003
@@ -265,13 +265,20 @@
 	 */
 
 	if (unlikely(cp->app && !pp->slave)) {
-		if (skb_is_nonlinear(skb) &&
-		    skb_linearize(skb, GFP_ATOMIC) != 0)
-			return NF_DROP;
+		if (!(skb = skb_share_check(skb, GFP_ATOMIC)))
+			return NF_STOLEN;
+
 	}
 
+	if (!pskb_may_pull(skb, sizeof(*iph)))
+		goto tx_error;
+
 	iph = skb->nh.iph;
 	ihl = iph->ihl << 2;
+	if (!pskb_may_pull(skb, sizeof(*iph) + ihl))
+		goto tx_error;
+
+	iph = skb->nh.iph;
 	h.raw = (char*) iph + ihl;
 	size = ntohs(iph->tot_len) - ihl;
 
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help