aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/tegra
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2014-10-30 10:32:56 -0400
committerThierry Reding <treding@nvidia.com>2014-11-13 10:18:31 -0500
commitdc6057ecb39edb34b0461ca55382094410bd257a (patch)
tree91cf5e001ee105e74977dd94c8e213d40c5f52d7 /drivers/gpu/drm/tegra
parent8fc8f7da9719c2d28fb32cdd74af9b6cd9bac20a (diff)
drm/tegra: gem: dumb: pitch and size are outputs
When creating a dumb buffer object using the DRM_IOCTL_MODE_CREATE_DUMB IOCTL, only the width, height, bpp and flags parameters are inputs. The caller is not guaranteed to zero out or set handle, pitch and size, so the driver must not treat these values as possible inputs. Fixes a bug where running the Weston compositor on Tegra DRM would cause an attempt to allocate a 3 GiB framebuffer to be allocated. Fixes: de2ba664c30f ("gpu: host1x: drm: Add memory manager and fb") Cc: stable@vger.kernel.org Signed-off-by: Thierry Reding <treding@nvidia.com>
Diffstat (limited to 'drivers/gpu/drm/tegra')
-rw-r--r--drivers/gpu/drm/tegra/gem.c10
1 files changed, 3 insertions, 7 deletions
diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c
index 8b1095d05c58..8348783f7d64 100644
--- a/drivers/gpu/drm/tegra/gem.c
+++ b/drivers/gpu/drm/tegra/gem.c
@@ -399,16 +399,12 @@ void tegra_bo_free_object(struct drm_gem_object *gem)
399int tegra_bo_dumb_create(struct drm_file *file, struct drm_device *drm, 399int tegra_bo_dumb_create(struct drm_file *file, struct drm_device *drm,
400 struct drm_mode_create_dumb *args) 400 struct drm_mode_create_dumb *args)
401{ 401{
402 int min_pitch = DIV_ROUND_UP(args->width * args->bpp, 8); 402 unsigned int min_pitch = DIV_ROUND_UP(args->width * args->bpp, 8);
403 struct tegra_drm *tegra = drm->dev_private; 403 struct tegra_drm *tegra = drm->dev_private;
404 struct tegra_bo *bo; 404 struct tegra_bo *bo;
405 405
406 min_pitch = round_up(min_pitch, tegra->pitch_align); 406 args->pitch = round_up(min_pitch, tegra->pitch_align);
407 if (args->pitch < min_pitch) 407 args->size = args->pitch * args->height;
408 args->pitch = min_pitch;
409
410 if (args->size < args->pitch * args->height)
411 args->size = args->pitch * args->height;
412 408
413 bo = tegra_bo_create_with_handle(file, drm, args->size, 0, 409 bo = tegra_bo_create_with_handle(file, drm, args->size, 0,
414 &args->handle); 410 &args->handle);