client: check event opcode in queue_event
authorSimon Ser <simon.ser@intel.com>
Wed, 28 Aug 2019 14:11:21 +0000 (17:11 +0300)
committerPekka Paalanen <pq@iki.fi>
Thu, 5 Sep 2019 11:01:12 +0000 (11:01 +0000)
If the client binds to a global with an interface mismatch, it may receive an
event from the server with an unknown opcode. See [1].

Instead of crashing, print a more useful debug message and close the connection.

[1]: https://gitlab.freedesktop.org/wayland/wayland/issues/113

Signed-off-by: Simon Ser <simon.ser@intel.com>
src/wayland-client.c

index 0821af1..ed50281 100644 (file)
@@ -1364,6 +1364,12 @@ queue_event(struct wl_display *display, int len)
                return size;
        }
 
+       if (opcode >= proxy->object.interface->event_count) {
+               wl_log("interface '%s' has no event %u\n",
+                      proxy->object.interface->name, opcode);
+               return -1;
+       }
+
        message = &proxy->object.interface->events[opcode];
        closure = wl_connection_demarshal(display->connection, size,
                                          &display->objects, message);