Commit 603a8bbe authored by Stephen Hemminger's avatar Stephen Hemminger Committed by David S. Miller

skbuff: don't corrupt mac_header on skb expansion

The skb mac_header field is sometimes NULL (or ~0u) as a sentinel
value. The places where skb is expanded add an offset which would
change this flag into an invalid pointer (or offset).
Signed-off-by: default avatarStephen Hemminger <shemminger@vyatta.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 19633e12
...@@ -661,7 +661,8 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old) ...@@ -661,7 +661,8 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
/* {transport,network,mac}_header are relative to skb->head */ /* {transport,network,mac}_header are relative to skb->head */
new->transport_header += offset; new->transport_header += offset;
new->network_header += offset; new->network_header += offset;
new->mac_header += offset; if (skb_mac_header_was_set(new))
new->mac_header += offset;
#endif #endif
skb_shinfo(new)->gso_size = skb_shinfo(old)->gso_size; skb_shinfo(new)->gso_size = skb_shinfo(old)->gso_size;
skb_shinfo(new)->gso_segs = skb_shinfo(old)->gso_segs; skb_shinfo(new)->gso_segs = skb_shinfo(old)->gso_segs;
...@@ -843,7 +844,8 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, ...@@ -843,7 +844,8 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail,
skb->tail += off; skb->tail += off;
skb->transport_header += off; skb->transport_header += off;
skb->network_header += off; skb->network_header += off;
skb->mac_header += off; if (skb_mac_header_was_set(skb))
skb->mac_header += off;
skb->csum_start += nhead; skb->csum_start += nhead;
skb->cloned = 0; skb->cloned = 0;
skb->hdr_len = 0; skb->hdr_len = 0;
...@@ -935,7 +937,8 @@ struct sk_buff *skb_copy_expand(const struct sk_buff *skb, ...@@ -935,7 +937,8 @@ struct sk_buff *skb_copy_expand(const struct sk_buff *skb,
#ifdef NET_SKBUFF_DATA_USES_OFFSET #ifdef NET_SKBUFF_DATA_USES_OFFSET
n->transport_header += off; n->transport_header += off;
n->network_header += off; n->network_header += off;
n->mac_header += off; if (skb_mac_header_was_set(skb))
n->mac_header += off;
#endif #endif
return n; return n;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment