[Mesa-dev] [PATCH 01/10] egl: move eglCreateDRMImageMESA's malloc later

Eric Engestrom eric.engestrom at imgtec.com
Thu Jul 6 13:58:19 UTC 2017


On Friday, 2017-06-30 12:15:11 +0100, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov at collabora.com>
> 
> Don't bother allocating any memory until we're finished parsing and
> sanitising all the attributes.
> 
> As a nice side effect we now consistently set eglError when any of
> the attrib/values are not correct.

Not initialising `err` would've caught this bug; please add the
following hunk to this commit?

---8<---
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index cf26242702..1ed511d6da 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -2298,7 +2298,7 @@ dri2_create_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp,
    _EGLImageAttribs attrs;
    unsigned int dri_use, valid_mask;
    int format;
-   EGLint err = EGL_SUCCESS;
+   EGLint err;
 
    (void) drv;
 
--->8---

Alternatively, you could move the call to _eglParseImageAttribList()
inside the `if()` and get rid or `err` altogether.

> 
> Strangely enough the spec does not mention _anything_ about what error
> should be set where, even if the implementation already sets the odd
> one.
> 
> Cc: Kristian Høgsberg <krh at bitplanet.net>
> Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
> ---
> Kristian can you shed some light? The extension seems quite sparse.
> 
> Weston used the extension back in 2011. While the Glamor bit were
> dropped somewhat recently in May 2017.
> 
> Other than those I cannot find any users of the extension - there's no
> piglit tests even :-\
> 
> A crazy idea: Should we deprecate the extension?
> ---
>  src/egl/drivers/dri2/egl_dri2.c | 52 ++++++++++++++++++-----------------------
>  1 file changed, 23 insertions(+), 29 deletions(-)
> 
> diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
> index cf262427020..e55bff6dbbf 100644
> --- a/src/egl/drivers/dri2/egl_dri2.c
> +++ b/src/egl/drivers/dri2/egl_dri2.c
> @@ -2302,27 +2302,20 @@ dri2_create_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp,
>  
>     (void) drv;
>  
> -   dri2_img = malloc(sizeof *dri2_img);
> -   if (!dri2_img) {
> -      _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr");
> -      return EGL_NO_IMAGE_KHR;
> -   }
> -
>     if (!attr_list) {
> -      err = EGL_BAD_PARAMETER;
> -      goto cleanup_img;
> +      _eglError(EGL_BAD_PARAMETER, __func__);
> +      return EGL_NO_IMAGE_KHR;
>     }
>  
> -   _eglInitImage(&dri2_img->base, disp);
> -
>     err = _eglParseImageAttribList(&attrs, disp, attr_list);
> -   if (err != EGL_SUCCESS)
> -      goto cleanup_img;
> +   if (err != EGL_SUCCESS) {
> +      _eglError(EGL_BAD_PARAMETER, __func__);
> +      return EGL_NO_IMAGE_KHR;
> +   }
>  
>     if (attrs.Width <= 0 || attrs.Height <= 0) {
> -      _eglLog(_EGL_WARNING, "bad width or height (%dx%d)",
> -            attrs.Width, attrs.Height);
> -      goto cleanup_img;
> +      _eglError(EGL_BAD_PARAMETER, __func__);
> +      return EGL_NO_IMAGE_KHR;
>     }
>  
>     switch (attrs.DRMBufferFormatMESA) {
> @@ -2330,9 +2323,8 @@ dri2_create_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp,
>        format = __DRI_IMAGE_FORMAT_ARGB8888;
>        break;
>     default:
> -      _eglLog(_EGL_WARNING, "bad image format value 0x%04x",
> -            attrs.DRMBufferFormatMESA);
> -      goto cleanup_img;
> +      _eglError(EGL_BAD_PARAMETER, __func__);
> +      return EGL_NO_IMAGE_KHR;
>     }
>  
>     valid_mask =
> @@ -2340,9 +2332,8 @@ dri2_create_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp,
>        EGL_DRM_BUFFER_USE_SHARE_MESA |
>        EGL_DRM_BUFFER_USE_CURSOR_MESA;
>     if (attrs.DRMBufferUseMESA & ~valid_mask) {
> -      _eglLog(_EGL_WARNING, "bad image use bit 0x%04x",
> -            attrs.DRMBufferUseMESA & ~valid_mask);
> -      goto cleanup_img;
> +      _eglError(EGL_BAD_PARAMETER, __func__);
> +      return EGL_NO_IMAGE_KHR;
>     }
>  
>     dri_use = 0;
> @@ -2353,22 +2344,25 @@ dri2_create_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp,
>     if (attrs.DRMBufferUseMESA & EGL_DRM_BUFFER_USE_CURSOR_MESA)
>        dri_use |= __DRI_IMAGE_USE_CURSOR;
>  
> +   dri2_img = malloc(sizeof *dri2_img);
> +   if (!dri2_img) {
> +      _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr");
> +      return EGL_NO_IMAGE_KHR;
> +   }
> +
> +   _eglInitImage(&dri2_img->base, disp);
> +
>     dri2_img->dri_image =
>        dri2_dpy->image->createImage(dri2_dpy->dri_screen,
>                                     attrs.Width, attrs.Height,
>                                     format, dri_use, dri2_img);
>     if (dri2_img->dri_image == NULL) {
> -      err = EGL_BAD_ALLOC;
> -      goto cleanup_img;
> +      free(dri2_img);
> +       _eglError(EGL_BAD_ALLOC, "dri2_create_drm_image_mesa");
> +      return EGL_NO_IMAGE_KHR;
>     }
>  
>     return &dri2_img->base;
> -
> - cleanup_img:
> -   free(dri2_img);
> -   _eglError(err, "dri2_create_drm_image_mesa");
> -
> -   return EGL_NO_IMAGE_KHR;
>  }
>  
>  static EGLBoolean
> -- 
> 2.13.0
> 


More information about the mesa-dev mailing list