From: Ray Strode <rstr...@redhat.com> At the moment if a gbm buffer is imported and the gbm buffer has an old-style GBM_BO_FORMAT format, the import will crash, since it's passed directly to DRI functions that expect a fourcc format (as provided by the newer GBM_FORMAT definitions)
This commit addresses the problem in two ways: 1) it prevents invalid formats from leading to a crash by returning EINVAL up front. 2) it translates GBM_BO_FORMAT formats into the comparable GBM_FORMAT formats. --- src/gbm/backends/dri/gbm_dri.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c index ccc3cc6..3deb2d9 100644 --- a/src/gbm/backends/dri/gbm_dri.c +++ b/src/gbm/backends/dri/gbm_dri.c @@ -679,65 +679,90 @@ gbm_dri_bo_import(struct gbm_device *gbm, default: return NULL; } break; } #endif case GBM_BO_IMPORT_EGL_IMAGE: { int dri_format; if (dri->lookup_image == NULL) { errno = EINVAL; return NULL; } image = dri->lookup_image(dri->screen, buffer, dri->lookup_user_data); image = dri->image->dupImage(image, NULL); dri->image->queryImage(image, __DRI_IMAGE_ATTRIB_FORMAT, &dri_format); gbm_format = gbm_dri_to_gbm_format(dri_format); if (gbm_format == 0) { errno = EINVAL; return NULL; } break; } case GBM_BO_IMPORT_FD: { struct gbm_import_fd_data *fd_data = buffer; int stride = fd_data->stride, offset = 0; + int dri_format; + + /* This switch statement serves two purposes: + * 1) return EINVAL if an invalid format is passed in + * 2) convert GBM_BO_FORMAT formats to fourcc format + */ + switch (fd_data->format) { + case GBM_FORMAT_RGB565: + case GBM_FORMAT_XRGB8888: + case GBM_FORMAT_ARGB8888: + case GBM_FORMAT_ABGR8888: + case GBM_FORMAT_ARGB2101010: + case GBM_FORMAT_XRGB2101010: + dri_format = fd_data->format; + break; + case GBM_BO_FORMAT_XRGB8888: + dri_format = GBM_FORMAT_XRGB8888; + break; + case GBM_BO_FORMAT_ARGB8888: + dri_format = GBM_FORMAT_ARGB8888; + break; + default: + errno = EINVAL; + return NULL; + } image = dri->image->createImageFromFds(dri->screen, fd_data->width, fd_data->height, - fd_data->format, + dri_format, &fd_data->fd, 1, &stride, &offset, NULL); gbm_format = fd_data->format; break; } default: errno = ENOSYS; return NULL; } bo = calloc(1, sizeof *bo); if (bo == NULL) return NULL; bo->image = image; if (usage & GBM_BO_USE_SCANOUT) dri_use |= __DRI_IMAGE_USE_SCANOUT; if (usage & GBM_BO_USE_CURSOR) dri_use |= __DRI_IMAGE_USE_CURSOR; if (dri->image->base.version >= 2 && !dri->image->validateUsage(bo->image, dri_use)) { errno = EINVAL; free(bo); return NULL; } -- 2.5.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev