]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ipv4: icmp: validate reply type before using icmp_pointers
authorRuide Cao <caoruide123@gmail.com>
Tue, 21 Apr 2026 04:16:31 +0000 (12:16 +0800)
committerJakub Kicinski <kuba@kernel.org>
Thu, 23 Apr 2026 18:40:08 +0000 (11:40 -0700)
Extended echo replies use ICMP_EXT_ECHOREPLY as the outbound reply type.
That value is outside the range covered by icmp_pointers[], which only
describes the traditional ICMP types up to NR_ICMP_TYPES.

Avoid consulting icmp_pointers[] for reply types outside that range, and
use array_index_nospec() for the remaining in-range lookup. Normal ICMP
replies keep their existing behavior unchanged.

Fixes: d329ea5bd884 ("icmp: add response to RFC 8335 PROBE messages")
Cc: stable@kernel.org
Reported-by: Yuan Tan <yuantan098@gmail.com>
Reported-by: Yifan Wu <yifanwucs@gmail.com>
Reported-by: Juefei Pu <tomapufckgml@gmail.com>
Reported-by: Xin Liu <bird@lzu.edu.cn>
Signed-off-by: Ruide Cao <caoruide123@gmail.com>
Signed-off-by: Ren Wei <n05ec@lzu.edu.cn>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/0dace90c01a5978e829ca741ef684dbd7304ce62.1776628519.git.caoruide123@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv4/icmp.c

index 2f4fac22d1aba3d100c57a56b51efd57283430a5..7eeff658b467aac6a10d7890aaa807b37d6ac3b9 100644 (file)
@@ -64,6 +64,7 @@
 #include <linux/jiffies.h>
 #include <linux/kernel.h>
 #include <linux/fcntl.h>
+#include <linux/nospec.h>
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/inet.h>
@@ -371,7 +372,9 @@ static int icmp_glue_bits(void *from, char *to, int offset, int len, int odd,
                                      to, len);
 
        skb->csum = csum_block_add(skb->csum, csum, odd);
-       if (icmp_pointers[icmp_param->data.icmph.type].error)
+       if (icmp_param->data.icmph.type <= NR_ICMP_TYPES &&
+           icmp_pointers[array_index_nospec(icmp_param->data.icmph.type,
+                                            NR_ICMP_TYPES + 1)].error)
                nf_ct_attach(skb, icmp_param->skb);
        return 0;
 }