aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/drivers/gpu/drm/panfrost/panfrost_gem.h
diff options
context:
space:
mode:
authorSteven Price <steven.price@arm.com>2022-12-19 14:01:30 +0000
committerSteven Price <steven.price@arm.com>2022-12-21 15:04:42 +0000
commit4217c6ac817451d5116687f3cc6286220dc43d49 (patch)
treef615a26607d8077e1b5423f8715052032cf7ab10 /drivers/gpu/drm/panfrost/panfrost_gem.h
parentdrm/plane-helper: Add the missing declaration of drm_atomic_state (diff)
downloadwireguard-linux-4217c6ac817451d5116687f3cc6286220dc43d49.tar.xz
wireguard-linux-4217c6ac817451d5116687f3cc6286220dc43d49.zip
drm/panfrost: Fix GEM handle creation ref-counting
panfrost_gem_create_with_handle() previously returned a BO but with the only reference being from the handle, which user space could in theory guess and release, causing a use-after-free. Additionally if the call to panfrost_gem_mapping_get() in panfrost_ioctl_create_bo() failed then a(nother) reference on the BO was dropped. The _create_with_handle() is a problematic pattern, so ditch it and instead create the handle in panfrost_ioctl_create_bo(). If the call to panfrost_gem_mapping_get() fails then this means that user space has indeed gone behind our back and freed the handle. In which case just return an error code. Reported-by: Rob Clark <robdclark@chromium.org> Fixes: f3ba91228e8e ("drm/panfrost: Add initial panfrost driver") Signed-off-by: Steven Price <steven.price@arm.com> Reviewed-by: Rob Clark <robdclark@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/20221219140130.410578-1-steven.price@arm.com
Diffstat (limited to '')
-rw-r--r--drivers/gpu/drm/panfrost/panfrost_gem.h5
1 files changed, 1 insertions, 4 deletions
diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.h b/drivers/gpu/drm/panfrost/panfrost_gem.h
index 8088d5fd8480..ad2877eeeccd 100644
--- a/drivers/gpu/drm/panfrost/panfrost_gem.h
+++ b/drivers/gpu/drm/panfrost/panfrost_gem.h
@@ -69,10 +69,7 @@ panfrost_gem_prime_import_sg_table(struct drm_device *dev,
struct sg_table *sgt);
struct panfrost_gem_object *
-panfrost_gem_create_with_handle(struct drm_file *file_priv,
- struct drm_device *dev, size_t size,
- u32 flags,
- uint32_t *handle);
+panfrost_gem_create(struct drm_device *dev, size_t size, u32 flags);
int panfrost_gem_open(struct drm_gem_object *obj, struct drm_file *file_priv);
void panfrost_gem_close(struct drm_gem_object *obj,