Commit 1f4c9d8a authored by Navaneeth K's avatar Navaneeth K Committed by Greg Kroah-Hartman
Browse files

most: core: fix resource leak in most_register_interface error paths



The function most_register_interface() did not correctly release resources
if it failed early (before registering the device). In these cases, it
returned an error code immediately, leaking the memory allocated for the
interface.

Fix this by initializing the device early via device_initialize() and
calling put_device() on all error paths.

The most_register_interface() is expected to call put_device() on
error which frees the resources allocated in the caller. The
put_device() either calls release_mdev() or dim2_release(),
depending on the caller.

Switch to using device_add() instead of device_register() to handle
the split initialization.

Acked-by: default avatarAbdun Nihaal <abdun.nihaal@gmail.com>
Signed-off-by: default avatarNavaneeth K <knavaneeth786@gmail.com>
Reviewed-by: default avatarDan Carpenter <dan.carpenter@linaro.org>
Link: https://patch.msgid.link/20251127165337.19172-1-knavaneeth786@gmail.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9448598b
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -1286,15 +1286,19 @@ int most_register_interface(struct most_interface *iface)
	    !iface->poison_channel || (iface->num_channels > MAX_CHANNELS))
		return -EINVAL;

	device_initialize(iface->dev);

	id = ida_alloc(&mdev_id, GFP_KERNEL);
	if (id < 0) {
		dev_err(iface->dev, "Failed to allocate device ID\n");
		put_device(iface->dev);
		return id;
	}

	iface->p = kzalloc(sizeof(*iface->p), GFP_KERNEL);
	if (!iface->p) {
		ida_free(&mdev_id, id);
		put_device(iface->dev);
		return -ENOMEM;
	}

@@ -1304,7 +1308,7 @@ int most_register_interface(struct most_interface *iface)
	iface->dev->bus = &mostbus;
	iface->dev->groups = interface_attr_groups;
	dev_set_drvdata(iface->dev, iface);
	if (device_register(iface->dev)) {
	if (device_add(iface->dev)) {
		dev_err(iface->dev, "Failed to register interface device\n");
		kfree(iface->p);
		put_device(iface->dev);