mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
tools/xenstore: ignore transaction id for [un]watch
Instead of ignoring the transaction id for XS_WATCH and XS_UNWATCH commands as it is documented in docs/misc/xenstore.txt, it is tested for validity today. Really ignore the transaction id for XS_WATCH and XS_UNWATCH. This is part of XSA-115. Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Julien Grall <jgrall@amazon.com> Reviewed-by: Paul Durrant <paul@xen.org>
This commit is contained in:
1 parent
705c7d8956
commit
09a4146bdc
1 file changed
+16
-10
@@ -1261,13 +1261,17 @@ static int do_set_perms(struct connection *conn, struct buffered_data *in)
|
||||
static struct {
|
||||
const char *str;
|
||||
int (*func)(struct connection *conn, struct buffered_data *in);
|
||||
unsigned int flags;
|
||||
#define XS_FLAG_NOTID (1U << 0) /* Ignore transaction id. */
|
||||
} const wire_funcs[XS_TYPE_COUNT] = {
|
||||
[XS_CONTROL] = { "CONTROL", do_control },
|
||||
[XS_DIRECTORY] = { "DIRECTORY", send_directory },
|
||||
[XS_READ] = { "READ", do_read },
|
||||
[XS_GET_PERMS] = { "GET_PERMS", do_get_perms },
|
||||
[XS_WATCH] = { "WATCH", do_watch },
|
||||
[XS_UNWATCH] = { "UNWATCH", do_unwatch },
|
||||
[XS_WATCH] =
|
||||
{ "WATCH", do_watch, XS_FLAG_NOTID },
|
||||
[XS_UNWATCH] =
|
||||
{ "UNWATCH", do_unwatch, XS_FLAG_NOTID },
|
||||
[XS_TRANSACTION_START] = { "TRANSACTION_START", do_transaction_start },
|
||||
[XS_TRANSACTION_END] = { "TRANSACTION_END", do_transaction_end },
|
||||
[XS_INTRODUCE] = { "INTRODUCE", do_introduce },
|
||||
@@ -1289,7 +1293,7 @@ static struct {
|
||||
|
||||
static const char *sockmsg_string(enum xsd_sockmsg_type type)
|
||||
{
|
||||
if ((unsigned)type < XS_TYPE_COUNT && wire_funcs[type].str)
|
||||
if ((unsigned int)type < ARRAY_SIZE(wire_funcs) && wire_funcs[type].str)
|
||||
return wire_funcs[type].str;
|
||||
|
||||
return "**UNKNOWN**";
|
||||
@@ -1304,7 +1308,14 @@ static void process_message(struct connection *conn, struct buffered_data *in)
|
||||
enum xsd_sockmsg_type type = in->hdr.msg.type;
|
||||
int ret;
|
||||
|
||||
trans = transaction_lookup(conn, in->hdr.msg.tx_id);
|
||||
if ((unsigned int)type >= XS_TYPE_COUNT || !wire_funcs[type].func) {
|
||||
eprintf("Client unknown operation %i", type);
|
||||
send_error(conn, ENOSYS);
|
||||
return;
|
||||
}
|
||||
|
||||
trans = (wire_funcs[type].flags & XS_FLAG_NOTID)
|
||||
? NULL : transaction_lookup(conn, in->hdr.msg.tx_id);
|
||||
if (IS_ERR(trans)) {
|
||||
send_error(conn, -PTR_ERR(trans));
|
||||
return;
|
||||
@@ -1313,12 +1324,7 @@ static void process_message(struct connection *conn, struct buffered_data *in)
|
||||
assert(conn->transaction == NULL);
|
||||
conn->transaction = trans;
|
||||
|
||||
if ((unsigned)type < XS_TYPE_COUNT && wire_funcs[type].func)
|
||||
ret = wire_funcs[type].func(conn, in);
|
||||
else {
|
||||
eprintf("Client unknown operation %i", type);
|
||||
ret = ENOSYS;
|
||||
}
|
||||
ret = wire_funcs[type].func(conn, in);
|
||||
if (ret)
|
||||
send_error(conn, ret);
|
||||
|
||||
|
||||