kobject: Replace strlcpy with strscpy
authorAzeem Shaikh <azeemshaikh38@gmail.com>
Thu, 31 Aug 2023 14:01:04 +0000 (14:01 +0000)
committerKees Cook <keescook@chromium.org>
Fri, 22 Sep 2023 16:50:56 +0000 (09:50 -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().

Direct replacement is safe here since return value of -errno
is used to check for truncation instead of sizeof(dest).

[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/20230831140104.207019-1-azeemshaikh38@gmail.com
Signed-off-by: Kees Cook <keescook@chromium.org>
lib/kobject_uevent.c

index 7c44b7ae4c5c34bb586a9c362ed9b06913b54bb1..fb9a2f06dd1e79db0e5db17362c88152790e2b36 100644 (file)
@@ -254,10 +254,10 @@ static int init_uevent_argv(struct kobj_uevent_env *env, const char *subsystem)
        int buffer_size = sizeof(env->buf) - env->buflen;
        int len;
 
-       len = strlcpy(&env->buf[env->buflen], subsystem, buffer_size);
-       if (len >= buffer_size) {
-               pr_warn("init_uevent_argv: buffer size of %d too small, needed %d\n",
-                       buffer_size, len);
+       len = strscpy(&env->buf[env->buflen], subsystem, buffer_size);
+       if (len < 0) {
+               pr_warn("%s: insufficient buffer space (%u left) for %s\n",
+                       __func__, buffer_size, subsystem);
                return -ENOMEM;
        }