[Mesa-dev] [PATCH] dri/kms: Always zero out struct drm_mode_create_dumb

Daniel Vetter daniel at ffwll.ch
Fri Nov 14 09:40:02 PST 2014


On Thu, Nov 13, 2014 at 07:05:51PM +0100, Thierry Reding wrote:
> From: Thierry Reding <treding at nvidia.com>
> 
> The DRM_IOCTL_MODE_CREATE_DUMB (and others) IOCTL isn't very rigorously
> specified, which has the effect that some kernel drivers do not consider
> the .pitch and .size fields of struct drm_mode_create_dumb outputs only.
> Instead they will use these as lower bounds and overwrite them only if
> the values that they compute are larger than what userspace provided.
> 
> This works if and only if userspace initializes the fields explicitly to
> either 0 or some meaningful value. However, if userspace just leaves the
> values uninitialized and the struct drm_mode_create_dumb is allocated on
> the stack for example, the driver may try to overallocate buffers.
> 
> Fortunately most userspace does zero out the structure before passing it
> to the IOCTL, but there are rare exceptions. Mesa is one of them. In an
> attempt to rectify this situation, kernel drivers are being updated to
> not use the .pitch and .size fields as inputs. However in order to fix
> the issue with older kernels, make sure that Mesa always zeros out the
> structure as well.
> 
> Future IOCTLs should be more rigorously defined so that structures can
> be validated and IOCTLs rejected if output fields aren't set to zero.
> 
> Signed-off-by: Thierry Reding <treding at nvidia.com>

Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>
> ---
>  src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c | 2 +-
>  src/gbm/backends/dri/gbm_dri.c                    | 1 +
>  2 files changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c b/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c
> index ee71027c5872..507983ec251a 100644
> --- a/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c
> +++ b/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c
> @@ -131,10 +131,10 @@ kms_sw_displaytarget_create(struct sw_winsys *ws,
>     kms_sw_dt->width = width;
>     kms_sw_dt->height = height;
>  
> +   memset(&create_req, 0, sizeof(create_req));
>     create_req.bpp = 32;
>     create_req.width = width;
>     create_req.height = height;
> -   create_req.handle = 0;
>     ret = drmIoctl(kms_sw->fd, DRM_IOCTL_MODE_CREATE_DUMB, &create_req);
>     if (ret)
>        goto free_bo;
> diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
> index 470a54f3dd89..bc263297ec33 100644
> --- a/src/gbm/backends/dri/gbm_dri.c
> +++ b/src/gbm/backends/dri/gbm_dri.c
> @@ -774,6 +774,7 @@ create_dumb(struct gbm_device *gbm,
>     if (bo == NULL)
>        return NULL;
>  
> +   memset(&create_arg, 0, sizeof(create_arg));
>     create_arg.bpp = 32;
>     create_arg.width = width;
>     create_arg.height = height;
> -- 
> 2.1.3
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch


More information about the mesa-dev mailing list