tools/xenstore: drop watch event messages exceeding maximum size

By setting a watch with a very large tag it is possible to trick
xenstored to send watch event messages exceeding the maximum allowed
payload size. This might in turn lead to a crash of xenstored as the
resulting error can cause dereferencing a NULL pointer in case there
is no active request being handled by the guest the watch event is
being sent to.

Fix that by just dropping such watch events. Additionally modify the
error handling to test the pointer to be not NULL before dereferencing
it.

This is XSA-324.

Signed-off-by: Juergen Gross <jgross@suse.com>
Acked-by: Julien Grall <jgrall@amazon.com>
This commit is contained in:
Juergen Gross authored and Jan Beulich committed 2020-12-15 14:21:04 +01:00
1 parent 782aa4bb53
commit 18c0abb8f7
2 files changed
+7

No files matched your search

+3
View File
@@ -680,6 +680,9 @@ void send_reply(struct connection *conn, enum xsd_sockmsg_type type,
/* Replies reuse the request buffer, events need a new one. */
if (type != XS_WATCH_EVENT) {
bdata = conn->in;
/* Drop asynchronous responses, e.g. errors for watch events. */
if (!bdata)
return;
bdata->inhdr = true;
bdata->used = 0;
conn->in = NULL;
+4
View File
@@ -92,6 +92,10 @@ static void add_event(struct connection *conn,
}
len = strlen(name) + 1 + strlen(watch->token) + 1;
/* Don't try to send over-long events. */
if (len > XENSTORE_PAYLOAD_MAX)
return;
data = talloc_array(ctx, char, len);
if (!data)
return;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.