uml: Replace strlcpy with strscpy
authorAzeem Shaikh <azeemshaikh38@gmail.com>
Wed, 14 Jun 2023 00:36:04 +0000 (00:36 +0000)
committerKees Cook <keescook@chromium.org>
Tue, 20 Jun 2023 20:35:37 +0000 (13:35 -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>
Signed-off-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20230614003604.1021205-1-azeemshaikh38@gmail.com
arch/um/include/shared/user.h
arch/um/os-Linux/drivers/tuntap_user.c

index bda66e5..0347a19 100644 (file)
@@ -52,6 +52,7 @@ static inline int printk(const char *fmt, ...)
 extern int in_aton(char *str);
 extern size_t strlcpy(char *, const char *, size_t);
 extern size_t strlcat(char *, const char *, size_t);
+extern size_t strscpy(char *, const char *, size_t);
 
 /* Copied from linux/compiler-gcc.h since we can't include it directly */
 #define barrier() __asm__ __volatile__("": : :"memory")
index 53eb3d5..2284e9c 100644 (file)
@@ -146,7 +146,7 @@ static int tuntap_open(void *data)
                }
                memset(&ifr, 0, sizeof(ifr));
                ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
-               strlcpy(ifr.ifr_name, pri->dev_name, sizeof(ifr.ifr_name));
+               strscpy(ifr.ifr_name, pri->dev_name, sizeof(ifr.ifr_name));
                if (ioctl(pri->fd, TUNSETIFF, &ifr) < 0) {
                        err = -errno;
                        printk(UM_KERN_ERR "TUNSETIFF failed, errno = %d\n",