diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2018-05-17 09:50:50 +0200 |
---|---|---|
committer | Michel Dänzer <michel@daenzer.net> | 2018-05-17 09:50:50 +0200 |
commit | 3dcfce8d0f495d09d7836caf98ef30d625b78a13 (patch) | |
tree | b8bf6121ed7a29f1ccc45ea725344887301986ba | |
parent | fdba5373522c008f43e9ca5a9e76e35c6e7ad73d (diff) |
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 <alexander.deucher@amd.com>
-rw-r--r-- | src/radeon_dri2.c | 40 |
1 files 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; } |