]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bpf: Allow all printable characters in BTF DATASEC names
authorEduard Zingerman <eddyz87@gmail.com>
Wed, 6 Mar 2024 10:45:28 +0000 (12:45 +0200)
committerAndrii Nakryiko <andrii@kernel.org>
Wed, 6 Mar 2024 23:18:16 +0000 (15:18 -0800)
The intent is to allow libbpf to use SEC("?.struct_ops") to identify
struct_ops maps that are optional, e.g. like in the following BPF code:

    SEC("?.struct_ops")
    struct test_ops optional_map = { ... };

Which yields the following BTF:

    ...
    [13] DATASEC '?.struct_ops' size=0 vlen=...
    ...

To load such BTF libbpf rewrites DATASEC name before load.
After this patch the rewrite won't be necessary.

Signed-off-by: Eduard Zingerman <eddyz87@gmail.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20240306104529.6453-15-eddyz87@gmail.com
kernel/bpf/btf.c

index 6ff0bd1a91d5617fb928e9f6338cb35e0e68b347..170d017e8e4afc1939ed2f82642b87cb8ee4f4aa 100644 (file)
@@ -809,9 +809,23 @@ static bool btf_name_valid_identifier(const struct btf *btf, u32 offset)
        return __btf_name_valid(btf, offset);
 }
 
+/* Allow any printable character in DATASEC names */
 static bool btf_name_valid_section(const struct btf *btf, u32 offset)
 {
-       return __btf_name_valid(btf, offset);
+       /* offset must be valid */
+       const char *src = btf_str_by_offset(btf, offset);
+       const char *src_limit;
+
+       /* set a limit on identifier length */
+       src_limit = src + KSYM_NAME_LEN;
+       src++;
+       while (*src && src < src_limit) {
+               if (!isprint(*src))
+                       return false;
+               src++;
+       }
+
+       return !*src;
 }
 
 static const char *__btf_name_by_offset(const struct btf *btf, u32 offset)