Skip to contentSkip to conversation

FAILED: patch "[PATCH] nvmem: core: fix leaks on registration errors" failed to apply to 4.4-stable tree

PATCH [email protected] 1 participant 1 message Jul 18, 2017

Subsystems (2)
lore
Share & tools
lore

[email protected]

author maintainer
#0 lore raw

The patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.

thanks,

greg k-h

------------------ original commit in Linus's tree ------------------

Quoted 1 line

From 3360acdf839170b612f5b212539694c20e3f16d0 Mon Sep 17 00:00:00 2001

From: Johan Hovold <[email protected]>
Date: Fri, 9 Jun 2017 10:59:07 +0100
Subject: [PATCH] nvmem: core: fix leaks on registration errors

Make sure to deregister and release the nvmem device and underlying memory on registration errors.

Note that the private data must be freed using put_device() once the struct device has been initialised.

Also note that there's a related reference leak in the deregistration function as reported by Mika Westerberg which is being fixed separately.

Fixes b6c217ab9be6 ("nvmem: Add backwards compatibility support for older EEPROM drivers.")
Fixes eace75cfdcf7 ("nvmem: Add a simple NVMEM framework for nvmem providers")
Cc stable <[email protected]> # 4.3
Cc Andrew Lunn <[email protected]>
Cc Srinivas Kandagatla <[email protected]>
Cc Mika Westerberg <[email protected]>
drivers/nvmem/core.c +8 -5
index 8c830a80a648..6cf916d9db6d 100644
@@ -489,21 +489,24 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config)
 
 	rval = device_add(&nvmem->dev);
 	if (rval)
-		goto out;
+		goto err_put_device;
 
 	if (config->compat) {
 		rval = nvmem_setup_compat(nvmem, config);
 		if (rval)
-			goto out;
+			goto err_device_del;
 	}
 
 	if (config->cells)
 		nvmem_add_cells(nvmem, config);
 
 	return nvmem;
-out:
-	ida_simple_remove(&nvmem_ida, nvmem->id);
-	kfree(nvmem);
+
+err_device_del:
+	device_del(&nvmem->dev);
+err_put_device:
+	put_device(&nvmem->dev);
+
 	return ERR_PTR(rval);
 }
 EXPORT_SYMBOL_GPL(nvmem_register);