Mesa (master): gbm: Disallow INVALID modifiers returned upon image creation
Ben Widawsky
bwidawsk at kemper.freedesktop.org
Tue Mar 21 22:00:33 UTC 2017
Module: Mesa
Branch: master
Commit: 2a16de9e4bb7d2f0e67fab42eb3f8a667393d04d
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2a16de9e4bb7d2f0e67fab42eb3f8a667393d04d
Author: Ben Widawsky <ben at bwidawsk.net>
Date: Tue Mar 21 11:59:51 2017 -0700
gbm: Disallow INVALID modifiers returned upon image creation
v2: Add a TODO about modifier validation (Jason)
Signed-off-by: Ben Widawsky <ben at bwidawsk.net>
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
---
src/gbm/backends/dri/gbm_dri.c | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
index a7ac149365..84b4dd8853 100644
--- a/src/gbm/backends/dri/gbm_dri.c
+++ b/src/gbm/backends/dri/gbm_dri.c
@@ -1143,12 +1143,29 @@ gbm_dri_bo_create(struct gbm_device *gbm,
goto failed;
}
+ /* It's acceptable to create an image with INVALID modifier in the list,
+ * but it cannot be on the only modifier (since it will certainly fail
+ * later). While we could easily catch this after modifier creation, doing
+ * the check here is a convenient debug check likely pointing at whatever
+ * interface the client is using to build its modifier list.
+ */
+ if (count == 1 && modifiers[0] == DRM_FORMAT_MOD_INVALID) {
+ fprintf(stderr, "Only invalid modifier specified\n");
+ errno = EINVAL;
+ goto failed;
+ }
+
bo->image =
dri->image->createImageWithModifiers(dri->screen,
width, height,
dri_format,
modifiers, count,
bo);
+
+ if (bo->image) {
+ /* The client passed in a list of invalid modifiers */
+ assert(gbm_dri_bo_get_modifier(&bo->base.base) != DRM_FORMAT_MOD_INVALID);
+ }
} else {
bo->image = dri->image->createImage(dri->screen, width, height,
dri_format, dri_use, bo);
@@ -1240,6 +1257,17 @@ gbm_dri_surface_create(struct gbm_device *gbm,
return NULL;
}
+ /* It's acceptable to create an image with INVALID modifier in the list,
+ * but it cannot be on the only modifier (since it will certainly fail
+ * later). While we could easily catch this after modifier creation, doing
+ * the check here is a convenient debug check likely pointing at whatever
+ * interface the client is using to build its modifier list.
+ */
+ if (count == 1 && modifiers[0] == DRM_FORMAT_MOD_INVALID) {
+ fprintf(stderr, "Only invalid modifier specified\n");
+ errno = EINVAL;
+ }
+
surf = calloc(1, sizeof *surf);
if (surf == NULL) {
errno = ENOMEM;
@@ -1263,6 +1291,10 @@ gbm_dri_surface_create(struct gbm_device *gbm,
return NULL;
}
+ /* TODO: We are deferring validation of modifiers until the image is actually
+ * created. This deferred creation can fail due to a modifier-format
+ * mismatch. The result is the client has a surface but no object to back it.
+ */
surf->base.count = count;
memcpy(surf->base.modifiers, modifiers, count * sizeof(*modifiers));
More information about the mesa-commit
mailing list