update brcm-2.4 to 2.4.35.4, integrate new broadcom system code, update broadcom...
[openwrt/staging/yousong.git] / target / linux / generic-2.4 / patches / 230-tun_get_user_backport.patch
index 636ffec11df830073eca1b2179b4588a9c364d15..a671d1a271cfe4dbf5dfe41c4c40e4a395cce3a2 100644 (file)
@@ -1,56 +1,8 @@
---- linux-2.4.32/drivers/net/tun.c 2006-10-28 18:21:45.000000000 +0100
-+++ new.linux-2.4.32/drivers/net/tun.c 2006-10-28 18:50:53.000000000 +0100
-@@ -185,22 +185,31 @@
- {
-       struct tun_pi pi = { 0, __constant_htons(ETH_P_IP) };
-       struct sk_buff *skb;
--      size_t len = count;
-+      size_t len = count, align = 0;
-       if (!(tun->flags & TUN_NO_PI)) {
-               if ((len -= sizeof(pi)) > count)
-                       return -EINVAL;
--              memcpy_fromiovec((void *)&pi, iv, sizeof(pi));
-+              if(memcpy_fromiovec((void *)&pi, iv, sizeof(pi)))
-+                      return -EFAULT;
-       }
-- 
--      if (!(skb = alloc_skb(len + 2, GFP_KERNEL))) {
-+
-+      if ((tun->flags & TUN_TYPE_MASK) == TUN_TAP_DEV)
-+              align = NET_IP_ALIGN;
-+  
-+      if (!(skb = alloc_skb(len + align, GFP_KERNEL))) {
-               tun->stats.rx_dropped++;
-               return -ENOMEM;
-       }
--      skb_reserve(skb, 2);
--      memcpy_fromiovec(skb_put(skb, len), iv, len);
-+      if (align)
-+              skb_reserve(skb, align);
-+      if (memcpy_fromiovec(skb_put(skb, len), iv, len)) {
-+              tun->stats.rx_dropped++;
-+              kfree_skb(skb);
-+              return -EFAULT;
-+      }
-       skb->dev = &tun->dev;
-       switch (tun->flags & TUN_TYPE_MASK) {
-@@ -271,7 +271,8 @@
-                       pi.flags |= TUN_PKT_STRIP;
-               }
-  
--              memcpy_toiovec(iv, (void *) &pi, sizeof(pi));
-+              if(memcpy_toiovec(iv, (void *) &pi, sizeof(pi)))
-+                      return -EFAULT;
-               total += sizeof(pi);
-       }       
---- linux-2.4.32/include/linux/skbuff.h        2006-10-28 19:31:31.000000000 +0100
-+++ new.linux-2.4.32/include/linux/skbuff.h    2006-10-28 19:29:27.000000000 +0100
-@@ -918,6 +918,49 @@
+Index: linux-2.4.35.4/include/linux/skbuff.h
+===================================================================
+--- linux-2.4.35.4.orig/include/linux/skbuff.h 2007-12-15 05:19:38.654623841 +0100
++++ linux-2.4.35.4/include/linux/skbuff.h      2007-12-15 05:20:05.060128604 +0100
+@@ -912,6 +912,49 @@
        skb->tail+=len;
  }
  
  extern int ___pskb_trim(struct sk_buff *skb, unsigned int len, int realloc);
  
  static inline void __skb_trim(struct sk_buff *skb, unsigned int len)
+Index: linux-2.4.35.4/drivers/net/tun.c
+===================================================================
+--- linux-2.4.35.4.orig/drivers/net/tun.c      2007-12-15 05:19:38.642623156 +0100
++++ linux-2.4.35.4/drivers/net/tun.c   2007-12-15 05:20:05.056128377 +0100
+@@ -185,22 +185,31 @@
+ {
+       struct tun_pi pi = { 0, __constant_htons(ETH_P_IP) };
+       struct sk_buff *skb;
+-      size_t len = count;
++      size_t len = count, align = 0;
+       if (!(tun->flags & TUN_NO_PI)) {
+               if ((len -= sizeof(pi)) > count)
+                       return -EINVAL;
+-              memcpy_fromiovec((void *)&pi, iv, sizeof(pi));
++              if(memcpy_fromiovec((void *)&pi, iv, sizeof(pi)))
++                      return -EFAULT;
+       }
+- 
+-      if (!(skb = alloc_skb(len + 2, GFP_KERNEL))) {
++
++      if ((tun->flags & TUN_TYPE_MASK) == TUN_TAP_DEV)
++              align = NET_IP_ALIGN;
++  
++      if (!(skb = alloc_skb(len + align, GFP_KERNEL))) {
+               tun->stats.rx_dropped++;
+               return -ENOMEM;
+       }
+-      skb_reserve(skb, 2);
+-      memcpy_fromiovec(skb_put(skb, len), iv, len);
++      if (align)
++              skb_reserve(skb, align);
++      if (memcpy_fromiovec(skb_put(skb, len), iv, len)) {
++              tun->stats.rx_dropped++;
++              kfree_skb(skb);
++              return -EFAULT;
++      }
+       skb->dev = &tun->dev;
+       switch (tun->flags & TUN_TYPE_MASK) {
+@@ -271,7 +280,8 @@
+                       pi.flags |= TUN_PKT_STRIP;
+               }
+  
+-              memcpy_toiovec(iv, (void *) &pi, sizeof(pi));
++              if(memcpy_toiovec(iv, (void *) &pi, sizeof(pi)))
++                      return -EFAULT;
+               total += sizeof(pi);
+       }