acpi, nfit: fix acpi_get_table leak
authorDan Williams <dan.j.williams@intel.com>
Mon, 3 Apr 2017 20:52:14 +0000 (13:52 -0700)
committerDan Williams <dan.j.williams@intel.com>
Thu, 13 Apr 2017 04:56:41 +0000 (21:56 -0700)
Calls to acpi_get_table() must be paired with acpi_put_table() to undo
the mapping established by acpi_tb_acquire_table().

It turns out this has no effect in practice since the NFIT will already
be mapped to support the /sys/firmware/acpi/tables/NFIT attribute in
sysfs.

Fixes: 6b11d1d67713 ("ACPI / osl: Remove acpi_get_table_with_size()/early_acpi_os_unmap_memory() users")
Cc: Lv Zheng <lv.zheng@intel.com>
Reported-by: Ross Zwisler <ross.zwisler@linux.intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/acpi/nfit/core.c

index c3decdca46f9d52a3ec755fc86e4dc4e440083db..53943d6f42140d78e3764fcc8bdd11d566ec025c 100644 (file)
@@ -2831,6 +2831,11 @@ void acpi_nfit_desc_init(struct acpi_nfit_desc *acpi_desc, struct device *dev)
 }
 EXPORT_SYMBOL_GPL(acpi_nfit_desc_init);
 
+static void acpi_nfit_put_table(void *table)
+{
+       acpi_put_table(table);
+}
+
 static int acpi_nfit_add(struct acpi_device *adev)
 {
        struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER, NULL };
@@ -2847,6 +2852,10 @@ static int acpi_nfit_add(struct acpi_device *adev)
                dev_dbg(dev, "failed to find NFIT at startup\n");
                return 0;
        }
+
+       rc = devm_add_action_or_reset(dev, acpi_nfit_put_table, tbl);
+       if (rc)
+               return rc;
        sz = tbl->length;
 
        acpi_desc = devm_kzalloc(dev, sizeof(*acpi_desc), GFP_KERNEL);