mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 03:24:45 +01:00
rust: pwm: Fix potential memory leak on init error
When initializing a PWM chip using pwmchip_alloc(), the allocated device
owns an initial reference that must be released on all error paths.
If __pinned_init() were to fail, the allocated pwm_chip would currently
leak because the error path returns without calling pwmchip_put().
Fixes: 7b3dce814a ("rust: pwm: Add Kconfig and basic data structures")
Signed-off-by: Kari Argillander <kari.argillander@gmail.com>
Acked-by: Michal Wilczynski <m.wilczynski@samsung.com>
Link: https://patch.msgid.link/20260102-pwm-rust-v2-1-2702ce57d571@gmail.com
Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
This commit is contained in:
parent
b0dc6c6e97
commit
a2633dc243
1 changed files with 5 additions and 1 deletions
|
|
@ -607,7 +607,11 @@ impl<T: PwmOps> Chip<T> {
|
|||
let drvdata_ptr = unsafe { bindings::pwmchip_get_drvdata(c_chip_ptr) };
|
||||
|
||||
// SAFETY: We construct the `T` object in-place in the allocated private memory.
|
||||
unsafe { data.__pinned_init(drvdata_ptr.cast())? };
|
||||
unsafe { data.__pinned_init(drvdata_ptr.cast()) }.inspect_err(|_| {
|
||||
// SAFETY: It is safe to call `pwmchip_put()` with a valid pointer obtained
|
||||
// from `pwmchip_alloc()`. We will not use pointer after this.
|
||||
unsafe { bindings::pwmchip_put(c_chip_ptr) }
|
||||
})?;
|
||||
|
||||
// SAFETY: `c_chip_ptr` points to a valid chip.
|
||||
unsafe {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue