perf: Replace strlcpy with strscpy
authorAzeem Shaikh <azeemshaikh38@gmail.com>
Mon, 3 Jul 2023 16:58:16 +0000 (16:58 +0000)
committerKees Cook <keescook@chromium.org>
Thu, 27 Jul 2023 15:51:25 +0000 (08:51 -0700)
strlcpy() reads the entire source buffer first.
This read may exceed the destination size limit.
This is both inefficient and can lead to linear read
overflows if a source string is not NUL-terminated [1].
In an effort to remove strlcpy() completely [2], replace
strlcpy() here with strscpy().
No return values were used, so direct replacement is safe.

[1] https://www.kernel.org/doc/html/latest/process/deprecated.html#strlcpy
[2] https://github.com/KSPP/linux/issues/89

Signed-off-by: Azeem Shaikh <azeemshaikh38@gmail.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20230703165817.2840457-1-azeemshaikh38@gmail.com
Signed-off-by: Kees Cook <keescook@chromium.org>
kernel/events/core.c

index 78ae7b6..2554f5f 100644 (file)
@@ -8249,7 +8249,7 @@ static void perf_event_comm_event(struct perf_comm_event *comm_event)
        unsigned int size;
 
        memset(comm, 0, sizeof(comm));
-       strlcpy(comm, comm_event->task->comm, sizeof(comm));
+       strscpy(comm, comm_event->task->comm, sizeof(comm));
        size = ALIGN(strlen(comm)+1, sizeof(u64));
 
        comm_event->comm = comm;
@@ -8704,7 +8704,7 @@ static void perf_event_mmap_event(struct perf_mmap_event *mmap_event)
        }
 
 cpy_name:
-       strlcpy(tmp, name, sizeof(tmp));
+       strscpy(tmp, name, sizeof(tmp));
        name = tmp;
 got_name:
        /*
@@ -9128,7 +9128,7 @@ void perf_event_ksymbol(u16 ksym_type, u64 addr, u32 len, bool unregister,
            ksym_type == PERF_RECORD_KSYMBOL_TYPE_UNKNOWN)
                goto err;
 
-       strlcpy(name, sym, KSYM_NAME_LEN);
+       strscpy(name, sym, KSYM_NAME_LEN);
        name_len = strlen(name) + 1;
        while (!IS_ALIGNED(name_len, sizeof(u64)))
                name[name_len++] = '\0';