diff options
author | Stephen Hemminger <shemminger@osdl.org> | 2006-08-26 20:28:30 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2006-08-26 20:28:30 -0700 |
commit | 3a13813e6effcfad5910d47b15b724621b50b878 (patch) | |
tree | 30aaf88578ee23b0a1c0f90e7ee1100244d62415 /include | |
parent | 8dbc16033e35c7443cd56cb5ba308bb19cb7b469 (diff) | |
download | linux-3.10-3a13813e6effcfad5910d47b15b724621b50b878.tar.gz linux-3.10-3a13813e6effcfad5910d47b15b724621b50b878.tar.bz2 linux-3.10-3a13813e6effcfad5910d47b15b724621b50b878.zip |
[BRIDGE] netfilter: memory corruption fix
The bridge-netfilter code will overwrite memory if there is not
headroom in the skb to save the header. This first showed up when
using Xen with sky2 driver that doesn't allocate the extra space.
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/netfilter_bridge.h | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/include/linux/netfilter_bridge.h b/include/linux/netfilter_bridge.h index 10c13dc4665..427c67ff89e 100644 --- a/include/linux/netfilter_bridge.h +++ b/include/linux/netfilter_bridge.h @@ -48,15 +48,25 @@ enum nf_br_hook_priorities { /* Only used in br_forward.c */ static inline -void nf_bridge_maybe_copy_header(struct sk_buff *skb) +int nf_bridge_maybe_copy_header(struct sk_buff *skb) { + int err; + if (skb->nf_bridge) { if (skb->protocol == __constant_htons(ETH_P_8021Q)) { + err = skb_cow(skb, 18); + if (err) + return err; memcpy(skb->data - 18, skb->nf_bridge->data, 18); skb_push(skb, 4); - } else + } else { + err = skb_cow(skb, 16); + if (err) + return err; memcpy(skb->data - 16, skb->nf_bridge->data, 16); + } } + return 0; } /* This is called by the IP fragmenting code and it ensures there is |