diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2015-11-11 12:11:28 -0500 |
---|---|---|
committer | Jani Nikula <jani.nikula@intel.com> | 2015-11-17 09:30:55 -0500 |
commit | 76dc3769d7c3cdcfa7c4c7768a7cb87cd91af12f (patch) | |
tree | bad6a79bd72592e3be08e1e317cc782ba8fdcb41 /drivers/gpu/drm | |
parent | ba8af3e592f7175b5f9a92d2cfcc00b82097d1be (diff) |
drm/i915: Don't clobber the addfb2 ioctl params
We try to convert the old way of of specifying fb tiling (obj->tiling)
into the new fb modifiers. We store the result in the passed in mode_cmd
structure. But that structure comes directly from the addfb2 ioctl, and
gets copied back out to userspace, which means we're clobbering the
modifiers that the user provided (all 0 since the DRM_MODE_FB_MODIFIERS
flag wasn't even set by the user). Hence if the user reuses the struct
for another addfb2, the ioctl will be rejected since it's now asking for
some modifiers w/o the flag set.
Fix the problem by making a copy of the user provided structure. We can
play any games we want with the copy.
IGT-Version: 1.12-git (x86_64) (Linux: 4.4.0-rc1-stereo+ x86_64)
...
Subtest basic-X-tiled: SUCCESS (0.001s)
Test assertion failure function pitch_tests, file kms_addfb_basic.c:167:
Failed assertion: drmIoctl(fd, DRM_IOCTL_MODE_ADDFB2, &f) == 0
Last errno: 22, Invalid argument
Stack trace:
#0 [__igt_fail_assert+0x101]
#1 [pitch_tests+0x619]
#2 [__real_main426+0x2f]
#3 [main+0x23]
#4 [__libc_start_main+0xf0]
#5 [_start+0x29]
#6 [<unknown>+0x29]
Subtest framebuffer-vs-set-tiling failed.
**** DEBUG ****
Test assertion failure function pitch_tests, file kms_addfb_basic.c:167:
Failed assertion: drmIoctl(fd, DRM_IOCTL_MODE_ADDFB2, &f) == 0
Last errno: 22, Invalid argument
**** END ****
Subtest framebuffer-vs-set-tiling: FAIL (0.003s)
...
IGT-Version: 1.12-git (x86_64) (Linux: 4.4.0-rc1-stereo+ x86_64)
Subtest framebuffer-vs-set-tiling: SUCCESS (0.000s)
Cc: stable@vger.kernel.org # v4.1+
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Fixes: 2a80eada326f ("drm/i915: Add fb format modifier support")
Testcase: igt/kms_addfb_basic/clobbered-modifier
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1447261890-3960-1-git-send-email-ville.syrjala@linux.intel.com
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 442c1d220276..8f80bbeb1313 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -14369,16 +14369,17 @@ static int intel_framebuffer_init(struct drm_device *dev, | |||
14369 | static struct drm_framebuffer * | 14369 | static struct drm_framebuffer * |
14370 | intel_user_framebuffer_create(struct drm_device *dev, | 14370 | intel_user_framebuffer_create(struct drm_device *dev, |
14371 | struct drm_file *filp, | 14371 | struct drm_file *filp, |
14372 | struct drm_mode_fb_cmd2 *mode_cmd) | 14372 | struct drm_mode_fb_cmd2 *user_mode_cmd) |
14373 | { | 14373 | { |
14374 | struct drm_i915_gem_object *obj; | 14374 | struct drm_i915_gem_object *obj; |
14375 | struct drm_mode_fb_cmd2 mode_cmd = *user_mode_cmd; | ||
14375 | 14376 | ||
14376 | obj = to_intel_bo(drm_gem_object_lookup(dev, filp, | 14377 | obj = to_intel_bo(drm_gem_object_lookup(dev, filp, |
14377 | mode_cmd->handles[0])); | 14378 | mode_cmd.handles[0])); |
14378 | if (&obj->base == NULL) | 14379 | if (&obj->base == NULL) |
14379 | return ERR_PTR(-ENOENT); | 14380 | return ERR_PTR(-ENOENT); |
14380 | 14381 | ||
14381 | return intel_framebuffer_create(dev, mode_cmd, obj); | 14382 | return intel_framebuffer_create(dev, &mode_cmd, obj); |
14382 | } | 14383 | } |
14383 | 14384 | ||
14384 | #ifndef CONFIG_DRM_FBDEV_EMULATION | 14385 | #ifndef CONFIG_DRM_FBDEV_EMULATION |