]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ACPI: APEI: EINJ: Fix resource leak by remove callback in .exit.text
authorUwe Kleine-König <u.kleine-koenig@baylibre.com>
Thu, 14 Aug 2025 05:11:57 +0000 (07:11 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 28 Aug 2025 14:34:32 +0000 (16:34 +0200)
commit b21d1fbb97c814c76ffa392cd603f8cd3ecc0355 upstream.

The .remove() callback is also used during error handling in
faux_probe(). As einj_remove() was marked with __exit it's not linked
into the kernel if the driver is built-in, potentially resulting in
resource leaks.

Also remove the comment justifying the __exit annotation which doesn't
apply any more since the driver was converted to the faux device
interface.

Fixes: 6cb9441bfe8d ("ACPI: APEI: EINJ: Transition to the faux device interface")
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Cc: 6.16+ <stable@vger.kernel.org> # 6.16+
Link: https://patch.msgid.link/20250814051157.35867-2-u.kleine-koenig@baylibre.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/acpi/apei/einj-core.c

index 9b041415a9d0186e34a5fbc7975566dd6aa15a80..aded7d8f8cafdd6c2630ce2f089f88e767b817d8 100644 (file)
@@ -842,7 +842,7 @@ err_put_table:
        return rc;
 }
 
-static void __exit einj_remove(struct faux_device *fdev)
+static void einj_remove(struct faux_device *fdev)
 {
        struct apei_exec_context ctx;
 
@@ -864,15 +864,9 @@ static void __exit einj_remove(struct faux_device *fdev)
 }
 
 static struct faux_device *einj_dev;
-/*
- * einj_remove() lives in .exit.text. For drivers registered via
- * platform_driver_probe() this is ok because they cannot get unbound at
- * runtime. So mark the driver struct with __refdata to prevent modpost
- * triggering a section mismatch warning.
- */
-static struct faux_device_ops einj_device_ops __refdata = {
+static struct faux_device_ops einj_device_ops = {
        .probe = einj_probe,
-       .remove = __exit_p(einj_remove),
+       .remove = einj_remove,
 };
 
 static int __init einj_init(void)