Skip to content

Commit 6706a97

Browse files
edumazetdavem330
authored andcommitted
dccp: fix out of bound access in dccp_v4_err()
dccp_v4_err() does not use pskb_may_pull() and might access garbage. We only need 4 bytes at the beginning of the DCCP header, like TCP, so the 8 bytes pulled in icmp_socket_deliver() are more than enough. This patch might allow to process more ICMP messages, as some routers are still limiting the size of reflected bytes to 28 (RFC 792), instead of extended lengths (RFC 1812 4.3.2.3) Signed-off-by: Eric Dumazet <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 346da62 commit 6706a97

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

net/dccp/ipv4.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ static void dccp_v4_err(struct sk_buff *skb, u32 info)
235235
{
236236
const struct iphdr *iph = (struct iphdr *)skb->data;
237237
const u8 offset = iph->ihl << 2;
238-
const struct dccp_hdr *dh = (struct dccp_hdr *)(skb->data + offset);
238+
const struct dccp_hdr *dh;
239239
struct dccp_sock *dp;
240240
struct inet_sock *inet;
241241
const int type = icmp_hdr(skb)->type;
@@ -245,11 +245,13 @@ static void dccp_v4_err(struct sk_buff *skb, u32 info)
245245
int err;
246246
struct net *net = dev_net(skb->dev);
247247

248-
if (skb->len < offset + sizeof(*dh) ||
249-
skb->len < offset + __dccp_basic_hdr_len(dh)) {
250-
__ICMP_INC_STATS(net, ICMP_MIB_INERRORS);
251-
return;
252-
}
248+
/* Only need dccph_dport & dccph_sport which are the first
249+
* 4 bytes in dccp header.
250+
* Our caller (icmp_socket_deliver()) already pulled 8 bytes for us.
251+
*/
252+
BUILD_BUG_ON(offsetofend(struct dccp_hdr, dccph_sport) > 8);
253+
BUILD_BUG_ON(offsetofend(struct dccp_hdr, dccph_dport) > 8);
254+
dh = (struct dccp_hdr *)(skb->data + offset);
253255

254256
sk = __inet_lookup_established(net, &dccp_hashinfo,
255257
iph->daddr, dh->dccph_dport,

0 commit comments

Comments
 (0)