mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
rust: drm: gem: clean up GEM state in init failure case
Currently, if `drm_gem_object_init` fails, the object is freed without
any cleanup. Perform the cleanup in that case.
Cc: stable@vger.kernel.org
Fixes: c284d3e423 ("rust: drm: gem: Add GEM object abstraction")
Signed-off-by: Eliot Courtney <ecourtney@nvidia.com>
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Reviewed-by: Onur Özkan <work@onurozkan.dev>
Link: https://patch.msgid.link/20260423-fix-gem-1-v1-1-e12e35f7bba9@nvidia.com
[ Move safety comment closer to unsafe block to avoid a clippy warning.
- Danilo ]
Signed-off-by: Danilo Krummrich <dakr@kernel.org>
This commit is contained in:
parent
15e8bae5d9
commit
2e42a17b8f
|
|
@ -277,8 +277,17 @@ pub fn new(dev: &drm::Device<T::Driver>, size: usize, args: T::Args) -> Result<A
|
|||
// SAFETY: `obj.as_raw()` is guaranteed to be valid by the initialization above.
|
||||
unsafe { (*obj.as_raw()).funcs = &Self::OBJECT_FUNCS };
|
||||
|
||||
// SAFETY: The arguments are all valid per the type invariants.
|
||||
to_result(unsafe { bindings::drm_gem_object_init(dev.as_raw(), obj.obj.get(), size) })?;
|
||||
if let Err(err) =
|
||||
// SAFETY: The arguments are all valid per the type invariants.
|
||||
to_result(unsafe {
|
||||
bindings::drm_gem_object_init(dev.as_raw(), obj.obj.get(), size)
|
||||
})
|
||||
{
|
||||
// SAFETY: `drm_gem_object_init()` initializes the private GEM object state before
|
||||
// failing, so `drm_gem_private_object_fini()` is the matching cleanup.
|
||||
unsafe { bindings::drm_gem_private_object_fini(obj.obj.get()) };
|
||||
return Err(err);
|
||||
}
|
||||
|
||||
// SAFETY: We will never move out of `Self` as `ARef<Self>` is always treated as pinned.
|
||||
let ptr = KBox::into_raw(unsafe { Pin::into_inner_unchecked(obj) });
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user