Commit dc6057ec authored by Thierry Reding's avatar Thierry Reding

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: de2ba664 ("gpu: host1x: drm: Add memory manager and fb")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
parent 8fc8f7da
...@@ -399,16 +399,12 @@ void tegra_bo_free_object(struct drm_gem_object *gem) ...@@ -399,16 +399,12 @@ void tegra_bo_free_object(struct drm_gem_object *gem)
int tegra_bo_dumb_create(struct drm_file *file, struct drm_device *drm, int tegra_bo_dumb_create(struct drm_file *file, struct drm_device *drm,
struct drm_mode_create_dumb *args) struct drm_mode_create_dumb *args)
{ {
int min_pitch = DIV_ROUND_UP(args->width * args->bpp, 8); unsigned int min_pitch = DIV_ROUND_UP(args->width * args->bpp, 8);
struct tegra_drm *tegra = drm->dev_private; struct tegra_drm *tegra = drm->dev_private;
struct tegra_bo *bo; struct tegra_bo *bo;
min_pitch = round_up(min_pitch, tegra->pitch_align); args->pitch = round_up(min_pitch, tegra->pitch_align);
if (args->pitch < min_pitch) args->size = args->pitch * args->height;
args->pitch = min_pitch;
if (args->size < args->pitch * args->height)
args->size = args->pitch * args->height;
bo = tegra_bo_create_with_handle(file, drm, args->size, 0, bo = tegra_bo_create_with_handle(file, drm, args->size, 0,
&args->handle); &args->handle);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment