bridge-netfilter: don't overwrite memory outside of skb
Subsystems (4)
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 1/1 bridge-netfilter: don't overwrite memory outside of skb
The bridge netfilter code needs to check for space at the front of the skb before overwriting; otherwise if skb from device doesn't have headroom, then it will cause random memory corruption.
include/linux/netfilter_bridge.h +12 -4
@@ -47,18 +47,26 @@#define BRNF_BRIDGED 0x08#define BRNF_NF_BRIDGE_PREROUTING 0x10 -/* Only used in br_forward.c */ -static inline -void nf_bridge_maybe_copy_header (struct sk_buff *skb) +static inline 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
net/bridge/br_forward.c +7 -3
@@ -43,11 +43,15 @@else {#ifdef CONFIG_BRIDGE_NETFILTER /* ip_refrag calls ip_fragment, doesn't copy the MAC header. */ -nf_bridge_maybe_copy_header (skb); +if (nf_bridge_maybe_copy_header (skb)) +kfree_skb (skb); + else#endif -skb_push (skb,ETH_HLEN ); + { +skb_push (skb,ETH_HLEN ); -dev_queue_xmit (skb); +dev_queue_xmit (skb); + } }return 0 ;
Greg KH
AppliedQuoted 6 lines · Stephen Hemminger
The bridge netfilter code needs to check for space at the front of the skb before overwriting; otherwise if skb from device doesn't have headroom, then it will cause random memory corruption.
Signed-off-by Stephen Hemminger <[email protected]>
Queued to -stable, thanks.
greg k-h