Commit 2e42a17b authored by Eliot Courtney's avatar Eliot Courtney Committed by Danilo Krummrich
Browse files

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: c284d3e4 ("rust: drm: gem: Add GEM object abstraction")
Signed-off-by: default avatarEliot Courtney <ecourtney@nvidia.com>
Reviewed-by: default avatarAlice Ryhl <aliceryhl@google.com>
Reviewed-by: default avatarOnur Ö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: default avatarDanilo Krummrich <dakr@kernel.org>
parent 15e8bae5
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -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 };

        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) })?;
            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) });