|
@@ -196,8 +196,8 @@ static inline void dccp_do_pmtu_discovery(struct sock *sk,
|
|
|
static void dccp_v4_err(struct sk_buff *skb, u32 info)
|
|
|
{
|
|
|
const struct iphdr *iph = (struct iphdr *)skb->data;
|
|
|
- const struct dccp_hdr *dh = (struct dccp_hdr *)(skb->data +
|
|
|
- (iph->ihl << 2));
|
|
|
+ const u8 offset = iph->ihl << 2;
|
|
|
+ const struct dccp_hdr *dh = (struct dccp_hdr *)(skb->data + offset);
|
|
|
struct dccp_sock *dp;
|
|
|
struct inet_sock *inet;
|
|
|
const int type = icmp_hdr(skb)->type;
|
|
@@ -207,7 +207,8 @@ static void dccp_v4_err(struct sk_buff *skb, u32 info)
|
|
|
int err;
|
|
|
struct net *net = dev_net(skb->dev);
|
|
|
|
|
|
- if (skb->len < (iph->ihl << 2) + 8) {
|
|
|
+ if (skb->len < offset + sizeof(*dh) ||
|
|
|
+ skb->len < offset + __dccp_basic_hdr_len(dh)) {
|
|
|
ICMP_INC_STATS_BH(net, ICMP_MIB_INERRORS);
|
|
|
return;
|
|
|
}
|