]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bpf: Make reg_not_null() true for CONST_PTR_TO_MAP
authorIhor Solodrai <isolodrai@meta.com>
Mon, 9 Jun 2025 18:30:22 +0000 (11:30 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Aug 2025 16:30:39 +0000 (18:30 +0200)
[ Upstream commit 5534e58f2e9bd72b253d033ee0af6e68eb8ac96b ]

When reg->type is CONST_PTR_TO_MAP, it can not be null. However the
verifier explores the branches under rX == 0 in check_cond_jmp_op()
even if reg->type is CONST_PTR_TO_MAP, because it was not checked for
in reg_not_null().

Fix this by adding CONST_PTR_TO_MAP to the set of types that are
considered non nullable in reg_not_null().

An old "unpriv: cmp map pointer with zero" selftest fails with this
change, because now early out correctly triggers in
check_cond_jmp_op(), making the verification to pass.

In practice verifier may allow pointer to null comparison in unpriv,
since in many cases the relevant branch and comparison op are removed
as dead code. So change the expected test result to __success_unpriv.

Signed-off-by: Ihor Solodrai <isolodrai@meta.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20250609183024.359974-2-isolodrai@meta.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
kernel/bpf/verifier.c
tools/testing/selftests/bpf/progs/verifier_unpriv.c

index b880dea7d85811d0f3c6956eb13edc24a7251838..24ae8f33e5d76d1bb32a1ed2d4df363c27d0d105 100644 (file)
@@ -400,7 +400,8 @@ static bool reg_not_null(const struct bpf_reg_state *reg)
                type == PTR_TO_MAP_KEY ||
                type == PTR_TO_SOCK_COMMON ||
                (type == PTR_TO_BTF_ID && is_trusted_reg(reg)) ||
-               type == PTR_TO_MEM;
+               type == PTR_TO_MEM ||
+               type == CONST_PTR_TO_MAP;
 }
 
 static struct btf_record *reg_btf_record(const struct bpf_reg_state *reg)
index 7ea535bfbacd3e8c01a61442a46be1107fec04fd..e4ef82a6ee38c8cf8f2487024ca39cd3147069e4 100644 (file)
@@ -619,7 +619,7 @@ __naked void pass_pointer_to_tail_call(void)
 
 SEC("socket")
 __description("unpriv: cmp map pointer with zero")
-__success __failure_unpriv __msg_unpriv("R1 pointer comparison")
+__success __success_unpriv
 __retval(0)
 __naked void cmp_map_pointer_with_zero(void)
 {