]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ACPI: extlog: fix NULL pointer dereference check
authorPrarit Bhargava <prarit@redhat.com>
Mon, 4 Dec 2023 18:00:37 +0000 (13:00 -0500)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 6 Dec 2023 20:21:09 +0000 (21:21 +0100)
The gcc plugin -fanalyzer [1] tries to detect various
patterns of incorrect behaviour.  The tool reports:

drivers/acpi/acpi_extlog.c: In function ‘extlog_exit’:
drivers/acpi/acpi_extlog.c:307:12: warning: check of ‘extlog_l1_addr’ for NULL after already dereferencing it [-Wanalyzer-deref-before-check]
    |
    |  306 |         ((struct extlog_l1_head *)extlog_l1_addr)->flags &= ~FLAG_OS_OPTIN;
    |      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
    |      |                                                  |
    |      |                                                  (1) pointer ‘extlog_l1_addr’ is dereferenced here
    |  307 |         if (extlog_l1_addr)
    |      |            ~
    |      |            |
    |      |            (2) pointer ‘extlog_l1_addr’ is checked for NULL here but it was already dereferenced at (1)
    |

Fix the NULL pointer dereference check in extlog_exit().

Link: https://gcc.gnu.org/onlinedocs/gcc-10.1.0/gcc/Static-Analyzer-Options.html
Signed-off-by: Prarit Bhargava <prarit@redhat.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpi_extlog.c

index e120a96e1eaee803c5beb0741072471de98a7bcf..193147769146eae5aafad66d3146456892646281 100644 (file)
@@ -303,9 +303,10 @@ err:
 static void __exit extlog_exit(void)
 {
        mce_unregister_decode_chain(&extlog_mce_dec);
-       ((struct extlog_l1_head *)extlog_l1_addr)->flags &= ~FLAG_OS_OPTIN;
-       if (extlog_l1_addr)
+       if (extlog_l1_addr) {
+               ((struct extlog_l1_head *)extlog_l1_addr)->flags &= ~FLAG_OS_OPTIN;
                acpi_os_unmap_iomem(extlog_l1_addr, l1_size);
+       }
        if (elog_addr)
                acpi_os_unmap_iomem(elog_addr, elog_size);
        release_mem_region(elog_base, elog_size);