On Fri, Apr 03, 2026 at 12:01:47AM +0800, Sun Jian wrote:
> diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c
> index 178c4738e63b..300e2bfc5a62 100644
> --- a/net/bpf/test_run.c
> +++ b/net/bpf/test_run.c
> @@ -1120,19 +1120,23 @@ int bpf_prog_test_run_skb(struct bpf_prog *prog, 
> const union bpf_attr *kattr,
>  
>       switch (skb->protocol) {
>       case htons(ETH_P_IP):
> -             sk->sk_family = AF_INET;
> -             if (sizeof(struct iphdr) <= skb_headlen(skb)) {
> -                     sk->sk_rcv_saddr = ip_hdr(skb)->saddr;
> -                     sk->sk_daddr = ip_hdr(skb)->daddr;
> +             if (skb_headlen(skb) < sizeof(struct iphdr)) {
> +                     ret = -EINVAL;
> +                     goto out;
>               }
> +             sk->sk_family = AF_INET;
> +             sk->sk_rcv_saddr = ip_hdr(skb)->saddr;
> +             sk->sk_daddr = ip_hdr(skb)->daddr;
>               break;
>  #if IS_ENABLED(CONFIG_IPV6)
>       case htons(ETH_P_IPV6):
> -             sk->sk_family = AF_INET6;
> -             if (sizeof(struct ipv6hdr) <= skb_headlen(skb)) {
> -                     sk->sk_v6_rcv_saddr = ipv6_hdr(skb)->saddr;
> -                     sk->sk_v6_daddr = ipv6_hdr(skb)->daddr;
> +             if (skb_headlen(skb) < sizeof(struct ipv6hdr)) {
> +                     ret = -EINVAL;
> +                     goto out;
>               }
> +             sk->sk_family = AF_INET6;
> +             sk->sk_v6_rcv_saddr = ipv6_hdr(skb)->saddr;
> +             sk->sk_v6_daddr = ipv6_hdr(skb)->daddr;
>               break;
>  #endif
>       default:
> diff --git a/tools/testing/selftests/bpf/prog_tests/empty_skb.c 
> b/tools/testing/selftests/bpf/prog_tests/empty_skb.c
> index 438583e1f2d1..d53567e9cd77 100644
> --- a/tools/testing/selftests/bpf/prog_tests/empty_skb.c
> +++ b/tools/testing/selftests/bpf/prog_tests/empty_skb.c
> @@ -12,6 +12,8 @@ void test_empty_skb(void)
>       struct bpf_program *prog;
>       char eth_hlen_pp[15];
>       char eth_hlen[14];
> +     char ipv4_eth_hlen[14];
> +     char ipv6_eth_hlen[14];

The eth_hlen_pp and eth_hlen needs to memset zero now.

Instead of adding two more ethhdrs, just reuse the current eth_hlen and
define it as 'struct ethhdr eth_hlen;' instead of a char array.
Add 'h_proto' to the anonymous 'struct { } tests[]'.  Initialize
the eth_hlen.h_proto based on the tests[i].h_proto.

Also, this test does not actually reproduce the reading uninit memeory.
It needs a bpf prog to actually trigger it by calling bpf_skb_adjust_room()
based on the report in the "Closes" link. The test should be able
to trigger it without the change in test_run.c

The ai-review has flagged again that it is missing a "Fixes" tag. This
probably started since the bpf_skb_adjust_room helper was introduced.

The selftests should also be in a separate patch 2 following the patch 1
changes in test_run.c.

pw-bot: cr

Reply via email to