]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
soc: aspeed: Add NULL check in aspeed_lpc_enable_snoop()
authorHenry Martin <bsdhenrymartin@gmail.com>
Thu, 15 May 2025 06:30:44 +0000 (16:00 +0930)
committerArnd Bergmann <arnd@arndb.de>
Wed, 21 May 2025 21:07:23 +0000 (23:07 +0200)
devm_kasprintf() returns NULL when memory allocation fails. Currently,
aspeed_lpc_enable_snoop() does not check for this case, which results in a
NULL pointer dereference.

Add NULL check after devm_kasprintf() to prevent this issue.

Fixes: 3772e5da4454 ("drivers/misc: Aspeed LPC snoop output using misc chardev")
Signed-off-by: Henry Martin <bsdhenrymartin@gmail.com>
Link: https://patch.msgid.link/20250401074647.21300-1-bsdhenrymartin@gmail.com
[arj: Fix Fixes: tag to use subject from 3772e5da4454]
Signed-off-by: Andrew Jeffery <andrew@codeconstruct.com.au>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
drivers/soc/aspeed/aspeed-lpc-snoop.c

index 57ba855f375d98007acdb6f7ef57a91c641cd3e5..ef8f355589a584d76bfac2b130ba9965c9b06ba5 100644 (file)
@@ -200,11 +200,15 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop,
        lpc_snoop->chan[channel].miscdev.minor = MISC_DYNAMIC_MINOR;
        lpc_snoop->chan[channel].miscdev.name =
                devm_kasprintf(dev, GFP_KERNEL, "%s%d", DEVICE_NAME, channel);
+       if (!lpc_snoop->chan[channel].miscdev.name) {
+               rc = -ENOMEM;
+               goto err_free_fifo;
+       }
        lpc_snoop->chan[channel].miscdev.fops = &snoop_fops;
        lpc_snoop->chan[channel].miscdev.parent = dev;
        rc = misc_register(&lpc_snoop->chan[channel].miscdev);
        if (rc)
-               return rc;
+               goto err_free_fifo;
 
        /* Enable LPC snoop channel at requested port */
        switch (channel) {
@@ -221,7 +225,8 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop,
                hicrb_en = HICRB_ENSNP1D;
                break;
        default:
-               return -EINVAL;
+               rc = -EINVAL;
+               goto err_misc_deregister;
        }
 
        regmap_update_bits(lpc_snoop->regmap, HICR5, hicr5_en, hicr5_en);
@@ -231,6 +236,12 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop,
                regmap_update_bits(lpc_snoop->regmap, HICRB,
                                hicrb_en, hicrb_en);
 
+       return 0;
+
+err_misc_deregister:
+       misc_deregister(&lpc_snoop->chan[channel].miscdev);
+err_free_fifo:
+       kfifo_free(&lpc_snoop->chan[channel].fifo);
        return rc;
 }