]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
s390/sclp: Add check for get_zeroed_page()
authorHaoxiang Li <haoxiang_li2024@163.com>
Tue, 18 Feb 2025 02:52:16 +0000 (10:52 +0800)
committerVasily Gorbik <gor@linux.ibm.com>
Tue, 4 Mar 2025 16:18:08 +0000 (17:18 +0100)
Add check for the return value of get_zeroed_page() in
sclp_console_init() to prevent null pointer dereference.
Furthermore, to solve the memory leak caused by the loop
allocation, add a free helper to do the free job.

Signed-off-by: Haoxiang Li <haoxiang_li2024@163.com>
Acked-by: Heiko Carstens <hca@linux.ibm.com>
Link: https://lore.kernel.org/r/20250218025216.2421548-1-haoxiang_li2024@163.com
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
drivers/s390/char/sclp_con.c

index e5d947c763ea5d41e202059a9f407f1d84d2cd6f..6a030ba38bf360246ca21ad091f25977ba2b0c4e 100644 (file)
@@ -263,6 +263,19 @@ static struct console sclp_console =
        .index = 0 /* ttyS0 */
 };
 
+/*
+ *  Release allocated pages.
+ */
+static void __init __sclp_console_free_pages(void)
+{
+       struct list_head *page, *p;
+
+       list_for_each_safe(page, p, &sclp_con_pages) {
+               list_del(page);
+               free_page((unsigned long)page);
+       }
+}
+
 /*
  * called by console_init() in drivers/char/tty_io.c at boot-time.
  */
@@ -282,6 +295,10 @@ sclp_console_init(void)
        /* Allocate pages for output buffering */
        for (i = 0; i < sclp_console_pages; i++) {
                page = (void *) get_zeroed_page(GFP_KERNEL | GFP_DMA);
+               if (!page) {
+                       __sclp_console_free_pages();
+                       return -ENOMEM;
+               }
                list_add_tail(page, &sclp_con_pages);
        }
        sclp_conbuf = NULL;