gbm: fail early when modifier list only contains INVALID
authorSimon Ser <contact@emersion.fr>
Tue, 26 Jan 2021 12:46:25 +0000 (13:46 +0100)
committerMarge Bot <eric+marge@anholt.net>
Wed, 17 Mar 2021 20:47:52 +0000 (20:47 +0000)
The current check only accomodates for a list with a single INVALID
item. However the driver won't be able to pick any modifier if the
list only contains INVALID. This includes the following cases:

- The modifier list is empty (count == 0)
- The modifier list contains more than a single item, but all items
  are INVALID

In these cases, also fail early.

Signed-off-by: Simon Ser <contact@emersion.fr>
References: https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7601#note_778845
Reviewed-by: Daniel Stone <daniel@fooishbar.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8715>

src/gbm/backends/dri/gbm_dri.c

index b563474..f381754 100644 (file)
@@ -1109,7 +1109,8 @@ gbm_dri_bo_create(struct gbm_device *gbm,
    struct gbm_dri_device *dri = gbm_dri_device(gbm);
    struct gbm_dri_bo *bo;
    int dri_format;
-   unsigned dri_use = 0;
+   unsigned dri_use = 0, i;
+   bool has_valid_modifier;
 
    /* Callers of this may specify a modifier, or a dri usage, but not both. The
     * newer modifier interface deprecates the older usage flags.
@@ -1162,7 +1163,14 @@ gbm_dri_bo_create(struct gbm_device *gbm,
        * 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) {
+      has_valid_modifier = false;
+      for (i = 0; i < count; i++) {
+         if (modifiers[i] != DRM_FORMAT_MOD_INVALID) {
+            has_valid_modifier = true;
+            break;
+         }
+      }
+      if (!has_valid_modifier) {
          fprintf(stderr, "Only invalid modifier specified\n");
          errno = EINVAL;
          goto failed;