diff options
| author | Changli Gao <xiaosuo@gmail.com> | 2010-08-04 00:55:40 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2010-08-05 00:53:15 -0400 |
| commit | 12dc96d1673feabef98eed1b5ff37abaa67fbe64 (patch) | |
| tree | 4f92d2b0eac8e5e2ceedfe42ae0182302d28de65 | |
| parent | 4b95c3d40d7d9927438ed7b7b49c84c60e27b65b (diff) | |
cls_rsvp: add sanity check for the packet length
The packet length should be checked before the packet data is dereferenced.
Signed-off-by: Changli Gao <xiaosuo@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | net/sched/cls_rsvp.h | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/net/sched/cls_rsvp.h b/net/sched/cls_rsvp.h index dd9414e44200..425a1790b048 100644 --- a/net/sched/cls_rsvp.h +++ b/net/sched/cls_rsvp.h | |||
| @@ -143,9 +143,17 @@ static int rsvp_classify(struct sk_buff *skb, struct tcf_proto *tp, | |||
| 143 | u8 tunnelid = 0; | 143 | u8 tunnelid = 0; |
| 144 | u8 *xprt; | 144 | u8 *xprt; |
| 145 | #if RSVP_DST_LEN == 4 | 145 | #if RSVP_DST_LEN == 4 |
| 146 | struct ipv6hdr *nhptr = ipv6_hdr(skb); | 146 | struct ipv6hdr *nhptr; |
| 147 | |||
| 148 | if (!pskb_network_may_pull(skb, sizeof(*nhptr))) | ||
| 149 | return -1; | ||
| 150 | nhptr = ipv6_hdr(skb); | ||
| 147 | #else | 151 | #else |
| 148 | struct iphdr *nhptr = ip_hdr(skb); | 152 | struct iphdr *nhptr; |
| 153 | |||
| 154 | if (!pskb_network_may_pull(skb, sizeof(*nhptr))) | ||
| 155 | return -1; | ||
| 156 | nhptr = ip_hdr(skb); | ||
| 149 | #endif | 157 | #endif |
| 150 | 158 | ||
| 151 | restart: | 159 | restart: |
