Reject messages not multiple of 4 bytes

At least libwayland and ocaml-wayland will never produce such messages,
and it is at best ambiguous whether they are allowed by the
specification.  There are also implementations of the Wayland protocol
that reject such messages, so using them has never been portable.

Signed-off-by: Demi Marie Obenour <demi@invisiblethingslab.com>
This commit is contained in:
Demi Marie Obenour 2024-07-24 21:17:49 -04:00
parent 5b692b50b9
commit 87e2b7d6c2
3 changed files with 20 additions and 3 deletions

View file

@ -110,8 +110,9 @@
</listitem>
<listitem>
<para>
The second has 2 parts of 16-bit. The upper 16-bits are the message
size in bytes, starting at the header (i.e. it has a minimum value of 8).The lower is the request/event opcode.
The second has 2 parts of 16 bits each. The upper 16 bits are the message
size in bytes, starting at the header (i.e. it has a minimum value of 8).
The lower is the request/event opcode. The size must be a multiple of 4.
</para>
</listitem>
</itemizedlist>

View file

@ -902,7 +902,14 @@ wl_connection_demarshal(struct wl_connection *connection,
/* Space for sender_id and opcode */
if (size < 2 * sizeof *p) {
wl_log("message too short, invalid header\n");
wl_log("message length %" PRIu32 " too short, invalid header\n", size);
wl_connection_consume(connection, size);
errno = EINVAL;
return NULL;
}
if (size % sizeof *p) {
wl_log("message length %" PRIu32 " invalid, not multiple of 4 bytes", size);
wl_connection_consume(connection, size);
errno = EINVAL;
return NULL;

View file

@ -400,6 +400,15 @@ wl_client_connection_data(int fd, uint32_t mask, void *data)
if (len < size)
break;
if ((size & 3) != 0) {
/* Post a better error than "invalid arguments" */
wl_resource_post_error(client->display_resource,
WL_DISPLAY_ERROR_INVALID_METHOD,
"message length %u is not multiple of 4",
size);
break;
}
resource = wl_map_lookup(&client->objects, p[0]);
resource_flags = wl_map_lookup_flags(&client->objects, p[0]);
if (resource == NULL) {