Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3360acdf authored by Johan Hovold's avatar Johan Hovold Committed by Greg Kroah-Hartman
Browse files

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: b6c217ab ("nvmem: Add backwards compatibility support for older EEPROM drivers.")
Fixes: eace75cf ("nvmem: Add a simple NVMEM framework for nvmem providers")
Cc: stable <stable@vger.kernel.org>     # 4.3
Cc: Andrew Lunn <andrew@lunn.ch>
Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Cc: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
Acked-by: default avatarAndrey Smirnov <andrew.smirnov@gmail.com>
Signed-off-by: default avatarSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent e827756d
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -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);