bpf: Replace deprecated strncpy with strscpy
authorJustin Stitt <justinstitt@google.com>
Tue, 2 Apr 2024 23:52:50 +0000 (23:52 +0000)
committerDaniel Borkmann <daniel@iogearbox.net>
Wed, 3 Apr 2024 14:57:41 +0000 (16:57 +0200)
strncpy() is deprecated for use on NUL-terminated destination strings
[1] and as such we should prefer more robust and less ambiguous string
interfaces.

bpf sym names get looked up and compared/cleaned with various string
apis. This suggests they need to be NUL-terminated (strncpy() suggests
this but does not guarantee it).

| static int compare_symbol_name(const char *name, char *namebuf)
| {
| cleanup_symbol_name(namebuf);
| return strcmp(name, namebuf);
| }

| static void cleanup_symbol_name(char *s)
| {
| ...
| res = strstr(s, ".llvm.");
| ...
| }

Use strscpy() as this method guarantees NUL-termination on the
destination buffer.

This patch also replaces two uses of strncpy() used in log.c. These are
simple replacements as postfix has been zero-initialized on the stack
and has source arguments with a size less than the destination's size.

Note that this patch uses the new 2-argument version of strscpy
introduced in commit e6584c3964f2f ("string: Allow 2-argument strscpy()").

Signed-off-by: Justin Stitt <justinstitt@google.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://www.kernel.org/doc/html/latest/process/deprecated.html#strncpy-on-nul-terminated-strings
Link: https://manpages.debian.org/testing/linux-manual-4.8/strscpy.9.en.html
Link: https://github.com/KSPP/linux/issues/90
Link: https://lore.kernel.org/bpf/20240402-strncpy-kernel-bpf-core-c-v1-1-7cb07a426e78@google.com
kernel/bpf/core.c
kernel/bpf/log.c

index ab400cdd7d7aea96e0a815b43a0e6d4ee63f45a1..ae406a2814db05a1b8df1400f5585c71ed409e54 100644 (file)
@@ -747,7 +747,7 @@ const char *__bpf_address_lookup(unsigned long addr, unsigned long *size,
                unsigned long symbol_start = ksym->start;
                unsigned long symbol_end = ksym->end;
 
-               strncpy(sym, ksym->name, KSYM_NAME_LEN);
+               strscpy(sym, ksym->name, KSYM_NAME_LEN);
 
                ret = sym;
                if (size)
@@ -813,7 +813,7 @@ int bpf_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
                if (it++ != symnum)
                        continue;
 
-               strncpy(sym, ksym->name, KSYM_NAME_LEN);
+               strscpy(sym, ksym->name, KSYM_NAME_LEN);
 
                *value = ksym->start;
                *type  = BPF_SYM_ELF_TYPE;
index 2a243cf37c60b1dbca97817dcde61c68af9f5cd5..4bd8f17a9f240114f5ca592c1b32d181c12b97b3 100644 (file)
@@ -467,9 +467,9 @@ const char *reg_type_str(struct bpf_verifier_env *env, enum bpf_reg_type type)
 
        if (type & PTR_MAYBE_NULL) {
                if (base_type(type) == PTR_TO_BTF_ID)
-                       strncpy(postfix, "or_null_", 16);
+                       strscpy(postfix, "or_null_");
                else
-                       strncpy(postfix, "_or_null", 16);
+                       strscpy(postfix, "_or_null");
        }
 
        snprintf(prefix, sizeof(prefix), "%s%s%s%s%s%s%s",