From 3dcfce8d0f495d09d7836caf98ef30d625b78a13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20D=C3=A4nzer?= Date: Thu, 17 May 2018 09:50:50 +0200 Subject: Bail from dri2_create_buffer2 if we can't get a pixmap We would store the NULL pointer and continue, which would lead to a crash down the road. Bugzilla: https://bugs.freedesktop.org/106293 Reviewed-by: Alex Deucher --- src/radeon_dri2.c | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c index 9f373589..3b75f66f 100644 --- a/src/radeon_dri2.c +++ b/src/radeon_dri2.c @@ -233,37 +233,36 @@ radeon_dri2_create_buffer2(ScreenPtr pScreen, flags | RADEON_CREATE_PIXMAP_DRI2); } + if (!pixmap) + return NULL; + buffers = calloc(1, sizeof *buffers); if (buffers == NULL) goto error; - if (pixmap) { - if (!info->use_glamor) { - info->exa_force_create = TRUE; - exaMoveInPixmap(pixmap); - info->exa_force_create = FALSE; - if (exaGetPixmapDriverPrivate(pixmap) == NULL) { - /* this happen if pixmap is non accelerable */ - goto error; - } - } else if (is_glamor_pixmap) { - pixmap = radeon_glamor_set_pixmap_bo(drawable, pixmap); - pixmap->refcnt++; - } - - if (!radeon_get_flink_name(pRADEONEnt, pixmap, &buffers->name)) + if (!info->use_glamor) { + info->exa_force_create = TRUE; + exaMoveInPixmap(pixmap); + info->exa_force_create = FALSE; + if (exaGetPixmapDriverPrivate(pixmap) == NULL) { + /* this happen if pixmap is non accelerable */ goto error; + } + } else if (is_glamor_pixmap) { + pixmap = radeon_glamor_set_pixmap_bo(drawable, pixmap); + pixmap->refcnt++; } + if (!radeon_get_flink_name(pRADEONEnt, pixmap, &buffers->name)) + goto error; + privates = calloc(1, sizeof(struct dri2_buffer_priv)); if (privates == NULL) goto error; buffers->attachment = attachment; - if (pixmap) { - buffers->pitch = pixmap->devKind; - buffers->cpp = cpp; - } + buffers->pitch = pixmap->devKind; + buffers->cpp = cpp; buffers->driverPrivate = privates; buffers->format = format; buffers->flags = 0; /* not tiled */ @@ -275,8 +274,7 @@ radeon_dri2_create_buffer2(ScreenPtr pScreen, error: free(buffers); - if (pixmap) - (*pScreen->DestroyPixmap)(pixmap); + (*pScreen->DestroyPixmap)(pixmap); return NULL; } -- cgit v1.2.3