mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-09-22 09:34:56 +02:00
intel_th: Fix error handling in intel_th_output_open
commit6d5925b667upstream. intel_th_output_open() calls bus_find_device_by_devt() which internally increments the device reference count via get_device(), but this reference is not properly released in several error paths. When device driver is unavailable, file operations cannot be obtained, or the driver's open method fails, the function returns without calling put_device(), leading to a permanent device reference count leak. This prevents the device from being properly released and could cause resource exhaustion over time. Found by code review. Cc: stable <stable@kernel.org> Fixes:39f4034693("intel_th: Add driver infrastructure for Intel(R) Trace Hub devices") Signed-off-by: Ma Ke <make24@iscas.ac.cn> Link: https://patch.msgid.link/20251112091723.35963-1-make24@iscas.ac.cn Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
1f53652922
commit
4157f7bba6
@@ -810,13 +810,17 @@ static int intel_th_output_open(struct inode *inode, struct file *file)
|
||||
int err;
|
||||
|
||||
dev = bus_find_device_by_devt(&intel_th_bus, inode->i_rdev);
|
||||
if (!dev || !dev->driver)
|
||||
return -ENODEV;
|
||||
if (!dev || !dev->driver) {
|
||||
err = -ENODEV;
|
||||
goto out_no_device;
|
||||
}
|
||||
|
||||
thdrv = to_intel_th_driver(dev->driver);
|
||||
fops = fops_get(thdrv->fops);
|
||||
if (!fops)
|
||||
return -ENODEV;
|
||||
if (!fops) {
|
||||
err = -ENODEV;
|
||||
goto out_put_device;
|
||||
}
|
||||
|
||||
replace_fops(file, fops);
|
||||
|
||||
@@ -824,10 +828,16 @@ static int intel_th_output_open(struct inode *inode, struct file *file)
|
||||
|
||||
if (file->f_op->open) {
|
||||
err = file->f_op->open(inode, file);
|
||||
return err;
|
||||
if (err)
|
||||
goto out_put_device;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
out_put_device:
|
||||
put_device(dev);
|
||||
out_no_device:
|
||||
return err;
|
||||
}
|
||||
|
||||
static const struct file_operations intel_th_output_fops = {
|
||||
|
||||
Reference in New Issue
Block a user