mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 05:44:45 +01:00
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: Abdun Nihaal <abdun.nihaal@gmail.com> Signed-off-by: Navaneeth K <knavaneeth786@gmail.com> Reviewed-by: Dan Carpenter <dan.carpenter@linaro.org> Link: https://patch.msgid.link/20251127165337.19172-1-knavaneeth786@gmail.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
9448598b22
commit
1f4c9d8a10
1 changed files with 5 additions and 1 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue