Skip to content

Commit f45b607

Browse files
committed
drm/gem-shmem: When drm_gem_object_init failed, should release object
jira VULN-136707 cve-pre CVE-2025-38449 commit-author ChunyouTang <tangchunyou@163.com> commit 7df34a6 when goto err_free, the object had init, so it should be release when fail. Signed-off-by: ChunyouTang <tangchunyou@163.com> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Link: https://patchwork.freedesktop.org/patch/msgid/20221119064131.364-1-tangchunyou@163.com (cherry picked from commit 7df34a6) Signed-off-by: Brett Mastbergen <bmastbergen@ciq.com>
1 parent d1b70b4 commit f45b607

File tree

3 files changed

+20
-4
lines changed

3 files changed

+20
-4
lines changed

drivers/gpu/drm/drm_gem.c

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,20 @@ void drm_gem_private_object_init(struct drm_device *dev,
168168
}
169169
EXPORT_SYMBOL(drm_gem_private_object_init);
170170

171+
/**
172+
* drm_gem_private_object_fini - Finalize a failed drm_gem_object
173+
* @obj: drm_gem_object
174+
*
175+
* Uninitialize an already allocated GEM object when it initialized failed
176+
*/
177+
void drm_gem_private_object_fini(struct drm_gem_object *obj)
178+
{
179+
WARN_ON(obj->dma_buf);
180+
181+
dma_resv_fini(&obj->_resv);
182+
}
183+
EXPORT_SYMBOL(drm_gem_private_object_fini);
184+
171185
/**
172186
* drm_gem_object_handle_free - release resources bound to userspace handles
173187
* @obj: GEM object to clean up.
@@ -929,12 +943,11 @@ drm_gem_release(struct drm_device *dev, struct drm_file *file_private)
929943
void
930944
drm_gem_object_release(struct drm_gem_object *obj)
931945
{
932-
WARN_ON(obj->dma_buf);
933-
934946
if (obj->filp)
935947
fput(obj->filp);
936948

937-
dma_resv_fini(&obj->_resv);
949+
drm_gem_private_object_fini(obj);
950+
938951
drm_gem_free_mmap_offset(obj);
939952
}
940953
EXPORT_SYMBOL(drm_gem_object_release);

drivers/gpu/drm/drm_gem_shmem_helper.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,10 @@ __drm_gem_shmem_create(struct drm_device *dev, size_t size, bool private)
7979
} else {
8080
ret = drm_gem_object_init(dev, obj, size);
8181
}
82-
if (ret)
82+
if (ret) {
83+
drm_gem_private_object_fini(obj);
8384
goto err_free;
85+
}
8486

8587
ret = drm_gem_create_mmap_offset(obj);
8688
if (ret)

include/drm/drm_gem.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ int drm_gem_object_init(struct drm_device *dev,
356356
struct drm_gem_object *obj, size_t size);
357357
void drm_gem_private_object_init(struct drm_device *dev,
358358
struct drm_gem_object *obj, size_t size);
359+
void drm_gem_private_object_fini(struct drm_gem_object *obj);
359360
void drm_gem_vm_open(struct vm_area_struct *vma);
360361
void drm_gem_vm_close(struct vm_area_struct *vma);
361362
int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size,

0 commit comments

Comments
 (0)