]> git.hungrycats.org Git - linux/commitdiff
drm: add a check for x/y in drm_mode_setcrtc
authorZhao Junwang <zhjwpku@gmail.com>
Tue, 7 Jul 2015 09:08:35 +0000 (17:08 +0800)
committerZefan Li <lizefan@huawei.com>
Mon, 21 Mar 2016 01:17:43 +0000 (09:17 +0800)
commit 01447e9f04ba1c49a9534ae6a5a6f26c2bb05226 upstream.

legacy setcrtc ioctl does take a 32 bit value which might indeed
overflow

the checks of crtc_req->x > INT_MAX and crtc_req->y > INT_MAX aren't
needed any more with this

v2: -polish the annotation according to Daniel's comment

Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Zhao Junwang <zhjwpku@gmail.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Zefan Li <lizefan@huawei.com>
drivers/gpu/drm/drm_crtc.c

index c61e6722216051b40d3753e23c060a682f22cda8..ed4b7481a865cd8adc83278a9ae0dc7ef6606153 100644 (file)
@@ -1836,8 +1836,11 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
        if (!drm_core_check_feature(dev, DRIVER_MODESET))
                return -EINVAL;
 
-       /* For some reason crtc x/y offsets are signed internally. */
-       if (crtc_req->x > INT_MAX || crtc_req->y > INT_MAX)
+       /*
+        * Universal plane src offsets are only 16.16, prevent havoc for
+        * drivers using universal plane code internally.
+        */
+       if (crtc_req->x & 0xffff0000 || crtc_req->y & 0xffff0000)
                return -ERANGE;
 
        mutex_lock(&dev->mode_config.mutex);