[Mesa-dev] [PATCH] i965: Fix bugs in intel_from_planar

Jason Ekstrand jason at jlekstrand.net
Sat Feb 10 06:50:01 UTC 2018


This commit fixes two bugs in intel_from_planar.  First, if the planar
format was non-NULL but only had a single plane, we were falling through
to the planar case.  If we had a CCS modifier and plane == 1, we would
return NULL instead of the CCS plane.  Second, if we did end up in the
planar_format == NULL case and the modifier was DRM_FORMAT_MOD_INVALID,
we would end up segfaulting in isl_drm_modifier_has_aux.

Cc: mesa-stable at lists.freedesktop.org
Fixes: 8f6e54c92966bb94a3f05f2cc7ea804273e125ad
---
 src/mesa/drivers/dri/i965/intel_screen.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
index 1f866cf..d4878f1 100644
--- a/src/mesa/drivers/dri/i965/intel_screen.c
+++ b/src/mesa/drivers/dri/i965/intel_screen.c
@@ -1313,12 +1313,18 @@ static __DRIimage *
 intel_from_planar(__DRIimage *parent, int plane, void *loaderPrivate)
 {
     int width, height, offset, stride, dri_format, index;
-    const struct intel_image_format *f;
     __DRIimage *image;
 
-    if (parent == NULL) {
+    if (parent == NULL)
        return NULL;
-    } else if (parent->planar_format == NULL) {
+
+    const struct intel_image_format *f = parent->planar_format;
+    const int nplanes = f ? f->nplanes : 1;
+
+    if (plane > nplanes) {
+       if (parent->modifier == DRM_FORMAT_MOD_INVALID)
+          return NULL;
+
        const bool is_aux =
           isl_drm_modifier_has_aux(parent->modifier) && plane == 1;
        if (!is_aux)
@@ -1332,10 +1338,6 @@ intel_from_planar(__DRIimage *parent, int plane, void *loaderPrivate)
     } else {
        /* Planar formats don't support aux buffers/images */
        assert(!isl_drm_modifier_has_aux(parent->modifier));
-       f = parent->planar_format;
-
-       if (plane >= f->nplanes)
-          return NULL;
 
        width = parent->width >> f->planes[plane].width_shift;
        height = parent->height >> f->planes[plane].height_shift;
-- 
2.5.0.400.gff86faf



More information about the mesa-dev mailing list