diff options
Diffstat (limited to 'net/sched/sch_dsmark.c')
-rw-r--r-- | net/sched/sch_dsmark.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c index 802ac7c2e5e8..5334e309f17f 100644 --- a/net/sched/sch_dsmark.c +++ b/net/sched/sch_dsmark.c | |||
@@ -201,9 +201,13 @@ static int dsmark_enqueue(struct sk_buff *skb, struct Qdisc *sch, | |||
201 | pr_debug("%s(skb %p,sch %p,[qdisc %p])\n", __func__, skb, sch, p); | 201 | pr_debug("%s(skb %p,sch %p,[qdisc %p])\n", __func__, skb, sch, p); |
202 | 202 | ||
203 | if (p->set_tc_index) { | 203 | if (p->set_tc_index) { |
204 | int wlen = skb_network_offset(skb); | ||
205 | |||
204 | switch (tc_skb_protocol(skb)) { | 206 | switch (tc_skb_protocol(skb)) { |
205 | case htons(ETH_P_IP): | 207 | case htons(ETH_P_IP): |
206 | if (skb_cow_head(skb, sizeof(struct iphdr))) | 208 | wlen += sizeof(struct iphdr); |
209 | if (!pskb_may_pull(skb, wlen) || | ||
210 | skb_try_make_writable(skb, wlen)) | ||
207 | goto drop; | 211 | goto drop; |
208 | 212 | ||
209 | skb->tc_index = ipv4_get_dsfield(ip_hdr(skb)) | 213 | skb->tc_index = ipv4_get_dsfield(ip_hdr(skb)) |
@@ -211,7 +215,9 @@ static int dsmark_enqueue(struct sk_buff *skb, struct Qdisc *sch, | |||
211 | break; | 215 | break; |
212 | 216 | ||
213 | case htons(ETH_P_IPV6): | 217 | case htons(ETH_P_IPV6): |
214 | if (skb_cow_head(skb, sizeof(struct ipv6hdr))) | 218 | wlen += sizeof(struct ipv6hdr); |
219 | if (!pskb_may_pull(skb, wlen) || | ||
220 | skb_try_make_writable(skb, wlen)) | ||
215 | goto drop; | 221 | goto drop; |
216 | 222 | ||
217 | skb->tc_index = ipv6_get_dsfield(ipv6_hdr(skb)) | 223 | skb->tc_index = ipv6_get_dsfield(ipv6_hdr(skb)) |