Skip to content

Commit

Permalink
net: Fix range checks in tcf_valid_offset().
Browse files Browse the repository at this point in the history
This function has three bugs:

1) The offset should be valid most of the time, this is just
   a sanity check, therefore we should use "likely" not "unlikely"

2) This is the only place where we can check for arithmetic overflow
   of the pointer plus the length.

3) The existing range checks are off by one, the valid range is
   skb->head to skb_tail_pointer(), inclusive.

Based almost entirely upon a patch by Ralph Loader.

Reported-by: Ralph Loader <suckfish@ihug.co.nz>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David S. Miller committed Dec 21, 2010
1 parent aa3e219 commit da521b2
Showing 1 changed file with 3 additions and 1 deletion.
4 changes: 3 additions & 1 deletion include/net/pkt_cls.h
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,9 @@ static inline unsigned char * tcf_get_base_ptr(struct sk_buff *skb, int layer)
static inline int tcf_valid_offset(const struct sk_buff *skb,
const unsigned char *ptr, const int len)
{
return unlikely((ptr + len) < skb_tail_pointer(skb) && ptr > skb->head);
return likely((ptr + len) <= skb_tail_pointer(skb) &&
ptr >= skb->head &&
(ptr <= (ptr + len)));
}

#ifdef CONFIG_NET_CLS_IND
Expand Down

0 comments on commit da521b2

Please sign in to comment.