From: Kees Cook <[email protected]>

In preparation for converting the kmalloc family of allocators to the
type-aware kmalloc_obj family, we need to make sure that the returned
type from the allocation matches the type of the variable being
assigned. (The kmalloc family returns "void *", which can be implicitly
cast to any pointer type.)

The new key map has as many entries as plain_map, but the size was taken
from the whole array, which would make the allocation type a pointer to
the array rather than the "unsigned short *" being assigned. Allocate
ARRAY_SIZE-many entries instead. The resulting allocation size is the
same.

Build tested ARCH=x86_64 allmodconfig with GCC 16.2.0:
drivers/tty/vt/keyboard.o

Assisted-by: LLM coccinelle
Signed-off-by: Kees Cook <[email protected]>
---
Cc: Greg Kroah-Hartman <[email protected]>
Cc: Jiri Slaby <[email protected]>
Cc: Nicolas Pitre <[email protected]>
Cc: <[email protected]>
---
 drivers/tty/vt/keyboard.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c
index c41d850b29c6..ef4a19aeb3ce 100644
--- a/drivers/tty/vt/keyboard.c
+++ b/drivers/tty/vt/keyboard.c
@@ -2002,7 +2002,9 @@ static int vt_kdskbent(unsigned char kbdmode, unsigned 
char idx,
                return 0;
 #endif
 
-       unsigned short __free(kfree) *new_map = kmalloc(sizeof(plain_map), 
GFP_KERNEL);
+       unsigned short __free(kfree) *new_map =
+               kmalloc_array(ARRAY_SIZE(plain_map), sizeof(*new_map),
+                             GFP_KERNEL);
        if (!new_map)
                return -ENOMEM;
 
-- 
2.34.1


Reply via email to