Commit 89f23b6e authored by Yu Zhao's avatar Yu Zhao Committed by Alex Deucher
Browse files

drm/amdgpu: validate user pitch alignment



Userspace may request pitch alignment that is not supported by GPU.
Some requests 32, but GPU ignores it and uses default 64 when cpp is
4. If GEM object is allocated based on the smaller alignment, GPU
DMA will go out of bound.

Cc: stable@vger.kernel.org # v4.2+
Reviewed-by: default avatarMichel Dänzer <michel.daenzer@amd.com>
Signed-off-by: default avatarYu Zhao <yuzhao@google.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent fadcb8f9
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -531,6 +531,16 @@ amdgpu_display_user_framebuffer_create(struct drm_device *dev,
	struct drm_gem_object *obj;
	struct amdgpu_framebuffer *amdgpu_fb;
	int ret;
	struct amdgpu_device *adev = dev->dev_private;
	int cpp = drm_format_plane_cpp(mode_cmd->pixel_format, 0);
	int pitch = mode_cmd->pitches[0] / cpp;

	pitch = amdgpu_align_pitch(adev, pitch, cpp, false);
	if (mode_cmd->pitches[0] != pitch) {
		DRM_DEBUG_KMS("Invalid pitch: expecting %d but got %d\n",
			      pitch, mode_cmd->pitches[0]);
		return ERR_PTR(-EINVAL);
	}

	obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[0]);
	if (obj ==  NULL) {