Skip to content

Commit

Permalink
[NET]: Warn in __skb_trim if skb is paged
Browse files Browse the repository at this point in the history
It's better to warn and fail rather than rarely triggering BUG on paths
that incorrectly call skb_trim/__skb_trim on a non-linear skb.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Herbert Xu authored and David S. Miller committed Jun 18, 2006
1 parent b38dfee commit 3cc0e87
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 17 deletions.
24 changes: 12 additions & 12 deletions include/linux/skbuff.h
Original file line number Diff line number Diff line change
Expand Up @@ -975,15 +975,16 @@ static inline void skb_reserve(struct sk_buff *skb, int len)
#define NET_SKB_PAD 16
#endif

extern int ___pskb_trim(struct sk_buff *skb, unsigned int len, int realloc);
extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);

static inline void __skb_trim(struct sk_buff *skb, unsigned int len)
{
if (!skb->data_len) {
skb->len = len;
skb->tail = skb->data + len;
} else
___pskb_trim(skb, len, 0);
if (unlikely(skb->data_len)) {
WARN_ON(1);
return;
}
skb->len = len;
skb->tail = skb->data + len;
}

/**
Expand All @@ -993,6 +994,7 @@ static inline void __skb_trim(struct sk_buff *skb, unsigned int len)
*
* Cut the length of a buffer down by removing data from the tail. If
* the buffer is already under the length specified it is not modified.
* The skb must be linear.
*/
static inline void skb_trim(struct sk_buff *skb, unsigned int len)
{
Expand All @@ -1003,12 +1005,10 @@ static inline void skb_trim(struct sk_buff *skb, unsigned int len)

static inline int __pskb_trim(struct sk_buff *skb, unsigned int len)
{
if (!skb->data_len) {
skb->len = len;
skb->tail = skb->data+len;
return 0;
}
return ___pskb_trim(skb, len, 1);
if (skb->data_len)
return ___pskb_trim(skb, len);
__skb_trim(skb, len);
return 0;
}

static inline int pskb_trim(struct sk_buff *skb, unsigned int len)
Expand Down
7 changes: 2 additions & 5 deletions net/core/skbuff.c
Original file line number Diff line number Diff line change
Expand Up @@ -801,12 +801,10 @@ struct sk_buff *skb_pad(struct sk_buff *skb, int pad)
return nskb;
}

/* Trims skb to length len. It can change skb pointers, if "realloc" is 1.
* If realloc==0 and trimming is impossible without change of data,
* it is BUG().
/* Trims skb to length len. It can change skb pointers.
*/

int ___pskb_trim(struct sk_buff *skb, unsigned int len, int realloc)
int ___pskb_trim(struct sk_buff *skb, unsigned int len)
{
int offset = skb_headlen(skb);
int nfrags = skb_shinfo(skb)->nr_frags;
Expand All @@ -816,7 +814,6 @@ int ___pskb_trim(struct sk_buff *skb, unsigned int len, int realloc)
int end = offset + skb_shinfo(skb)->frags[i].size;
if (end > len) {
if (skb_cloned(skb)) {
BUG_ON(!realloc);
if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC))
return -ENOMEM;
}
Expand Down

0 comments on commit 3cc0e87

Please sign in to comment.