]> git.hungrycats.org Git - linux/commitdiff
[EBTABLES]: Copy skb when shared.
authorBart De Schuymer <bdschuym@pandora.be>
Sun, 20 Jul 2003 22:06:00 +0000 (15:06 -0700)
committerDavid S. Miller <davem@nuts.ninka.net>
Sun, 20 Jul 2003 22:06:00 +0000 (15:06 -0700)
net/bridge/netfilter/ebt_dnat.c
net/bridge/netfilter/ebt_redirect.c
net/bridge/netfilter/ebt_snat.c

index fd9a6245ccb33015b18b11a043c8f6f5fce16c6b..c8b3357cc090b2c3a5ebdbdc8243a3d531b21977 100644 (file)
@@ -19,6 +19,17 @@ static int ebt_target_dnat(struct sk_buff **pskb, unsigned int hooknr,
 {
        struct ebt_nat_info *info = (struct ebt_nat_info *)data;
 
+       if (skb_shared(*pskb) || skb_cloned(*pskb)) {
+               struct sk_buff *nskb;
+
+               nskb = skb_copy(*pskb, GFP_ATOMIC);
+               if (!nskb)
+                       return NF_DROP;
+               if ((*pskb)->sk)
+                       skb_set_owner_w(nskb, (*pskb)->sk);
+               kfree_skb(*pskb);
+               *pskb = nskb;
+       }
        memcpy(((**pskb).mac.ethernet)->h_dest, info->mac,
           ETH_ALEN * sizeof(unsigned char));
        return info->target;
index be4346095c67aa0ff8355f76249e552cfec2bca6..d97d05fdd14f4b053148619473c89e8f5016521c 100644 (file)
@@ -20,6 +20,17 @@ static int ebt_target_redirect(struct sk_buff **pskb, unsigned int hooknr,
 {
        struct ebt_redirect_info *info = (struct ebt_redirect_info *)data;
 
+       if (skb_shared(*pskb) || skb_cloned(*pskb)) {
+               struct sk_buff *nskb;
+
+               nskb = skb_copy(*pskb, GFP_ATOMIC);
+               if (!nskb)
+                       return NF_DROP;
+               if ((*pskb)->sk)
+                       skb_set_owner_w(nskb, (*pskb)->sk);
+               kfree_skb(*pskb);
+               *pskb = nskb;
+       }
        if (hooknr != NF_BR_BROUTING)
                memcpy((**pskb).mac.ethernet->h_dest,
                   in->br_port->br->dev->dev_addr, ETH_ALEN);
index 3c0a6506d8469c635db3045cc37194a3e7569dd7..c457ac90c5c62c524e51dde6e2252bd9adf3785f 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/netfilter_bridge/ebtables.h>
 #include <linux/netfilter_bridge/ebt_nat.h>
 #include <linux/module.h>
+#include <net/sock.h>
 
 static int ebt_target_snat(struct sk_buff **pskb, unsigned int hooknr,
    const struct net_device *in, const struct net_device *out,
@@ -18,6 +19,17 @@ static int ebt_target_snat(struct sk_buff **pskb, unsigned int hooknr,
 {
        struct ebt_nat_info *info = (struct ebt_nat_info *) data;
 
+       if (skb_shared(*pskb) || skb_cloned(*pskb)) {
+               struct sk_buff *nskb;
+
+               nskb = skb_copy(*pskb, GFP_ATOMIC);
+               if (!nskb)
+                       return NF_DROP;
+               if ((*pskb)->sk)
+                       skb_set_owner_w(nskb, (*pskb)->sk);
+               kfree_skb(*pskb);
+               *pskb = nskb;
+       }
        memcpy(((**pskb).mac.ethernet)->h_source, info->mac,
           ETH_ALEN * sizeof(unsigned char));
        return info->target;