Patch "bpf/btf: Accept function names that contain dots" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    bpf/btf: Accept function names that contain dots

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     bpf-btf-accept-function-names-that-contain-dots.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 8b7d51610788b7a052718806517b2de217f845d3
Author: Florent Revest <revest@xxxxxxxxxxxx>
Date:   Thu Jun 15 16:56:07 2023 +0200

    bpf/btf: Accept function names that contain dots
    
    [ Upstream commit 9724160b3942b0a967b91a59f81da5593f28b8ba ]
    
    When building a kernel with LLVM=1, LLVM_IAS=0 and CONFIG_KASAN=y, LLVM
    leaves DWARF tags for the "asan.module_ctor" & co symbols. In turn,
    pahole creates BTF_KIND_FUNC entries for these and this makes the BTF
    metadata validation fail because they contain a dot.
    
    In a dramatic turn of event, this BTF verification failure can cause
    the netfilter_bpf initialization to fail, causing netfilter_core to
    free the netfilter_helper hashmap and netfilter_ftp to trigger a
    use-after-free. The risk of u-a-f in netfilter will be addressed
    separately but the existence of "asan.module_ctor" debug info under some
    build conditions sounds like a good enough reason to accept functions
    that contain dots in BTF.
    
    Although using only LLVM=1 is the recommended way to compile clang-based
    kernels, users can certainly do LLVM=1, LLVM_IAS=0 as well and we still
    try to support that combination according to Nick. To clarify:
    
      - > v5.10 kernel, LLVM=1 (LLVM_IAS=0 is not the default) is recommended,
        but user can still have LLVM=1, LLVM_IAS=0 to trigger the issue
    
      - <= 5.10 kernel, LLVM=1 (LLVM_IAS=0 is the default) is recommended in
        which case GNU as will be used
    
    Fixes: 1dc92851849c ("bpf: kernel side support for BTF Var and DataSec")
    Signed-off-by: Florent Revest <revest@xxxxxxxxxxxx>
    Signed-off-by: Daniel Borkmann <daniel@xxxxxxxxxxxxx>
    Acked-by: Andrii Nakryiko <andrii@xxxxxxxxxx>
    Cc: Yonghong Song <yhs@xxxxxxxx>
    Cc: Nick Desaulniers <ndesaulniers@xxxxxxxxxx>
    Link: https://lore.kernel.org/bpf/20230615145607.3469985-1-revest@xxxxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
index a8838a32f750e..8220caa488c54 100644
--- a/kernel/bpf/btf.c
+++ b/kernel/bpf/btf.c
@@ -735,13 +735,12 @@ static bool btf_name_offset_valid(const struct btf *btf, u32 offset)
 	return offset < btf->hdr.str_len;
 }
 
-static bool __btf_name_char_ok(char c, bool first, bool dot_ok)
+static bool __btf_name_char_ok(char c, bool first)
 {
 	if ((first ? !isalpha(c) :
 		     !isalnum(c)) &&
 	    c != '_' &&
-	    ((c == '.' && !dot_ok) ||
-	      c != '.'))
+	    c != '.')
 		return false;
 	return true;
 }
@@ -758,20 +757,20 @@ static const char *btf_str_by_offset(const struct btf *btf, u32 offset)
 	return NULL;
 }
 
-static bool __btf_name_valid(const struct btf *btf, u32 offset, bool dot_ok)
+static bool __btf_name_valid(const struct btf *btf, u32 offset)
 {
 	/* offset must be valid */
 	const char *src = btf_str_by_offset(btf, offset);
 	const char *src_limit;
 
-	if (!__btf_name_char_ok(*src, true, dot_ok))
+	if (!__btf_name_char_ok(*src, true))
 		return false;
 
 	/* set a limit on identifier length */
 	src_limit = src + KSYM_NAME_LEN;
 	src++;
 	while (*src && src < src_limit) {
-		if (!__btf_name_char_ok(*src, false, dot_ok))
+		if (!__btf_name_char_ok(*src, false))
 			return false;
 		src++;
 	}
@@ -779,17 +778,14 @@ static bool __btf_name_valid(const struct btf *btf, u32 offset, bool dot_ok)
 	return !*src;
 }
 
-/* Only C-style identifier is permitted. This can be relaxed if
- * necessary.
- */
 static bool btf_name_valid_identifier(const struct btf *btf, u32 offset)
 {
-	return __btf_name_valid(btf, offset, false);
+	return __btf_name_valid(btf, offset);
 }
 
 static bool btf_name_valid_section(const struct btf *btf, u32 offset)
 {
-	return __btf_name_valid(btf, offset, true);
+	return __btf_name_valid(btf, offset);
 }
 
 static const char *__btf_name_by_offset(const struct btf *btf, u32 offset)
@@ -4044,7 +4040,7 @@ static s32 btf_var_check_meta(struct btf_verifier_env *env,
 	}
 
 	if (!t->name_off ||
-	    !__btf_name_valid(env->btf, t->name_off, true)) {
+	    !__btf_name_valid(env->btf, t->name_off)) {
 		btf_verifier_log_type(env, t, "Invalid name");
 		return -EINVAL;
 	}



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux