Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP5:Update
xen.19021
xsa115-7.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File xsa115-7.patch of Package xen.19021
From 6ca2e14b43aecc79effc1a0cd528a4aceef44d42 Mon Sep 17 00:00:00 2001 From: Juergen Gross <jgross@suse.com> Date: Thu, 11 Jun 2020 16:12:43 +0200 Subject: [PATCH 07/10] tools/xenstore: fire watches only when removing a specific node Instead of firing all watches for removing a subtree in one go, do so only when the related node is being removed. The watches for the top-most node being removed include all watches including that node, while watches for nodes below that are only fired if they are matching exactly. This avoids firing any watch more than once when removing a subtree. 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> --- tools/xenstore/xenstored_core.c | 11 ++++++----- tools/xenstore/xenstored_watch.c | 13 ++++++++----- tools/xenstore/xenstored_watch.h | 4 ++-- 3 files changed, 16 insertions(+), 12 deletions(-) --- xen-4.7.6-testing.orig/tools/xenstore/xenstored_core.c +++ xen-4.7.6-testing/tools/xenstore/xenstored_core.c @@ -1120,8 +1120,8 @@ static void delete_child(struct connecti corrupt(conn, "Can't find child '%s' in %s", childname, node->name); } -static int delete_node(struct connection *conn, struct node *parent, - struct node *node) +static int delete_node(struct connection *conn, const void *ctx, + struct node *parent, struct node *node) { char *name; @@ -1133,7 +1133,7 @@ static int delete_node(struct connection node->children); child = name ? read_node(conn, node, name) : NULL; if (child) { - if (delete_node(conn, node, child)) + if (delete_node(conn, ctx, node, child)) return errno; } else { trace("delete_node: Error deleting child '%s/%s'!\n", @@ -1145,6 +1145,7 @@ static int delete_node(struct connection talloc_free(name); } + fire_watches(conn, ctx, node->name, true); delete_node_single(conn, node); delete_child(conn, parent, basename(node->name)); talloc_free(node); @@ -1174,8 +1175,8 @@ static int _rm(struct connection *conn, * This fine as we are single threaded and the next possible read will * be handled only after the node has been really removed. */ - fire_watches(conn, ctx, name, true); - return delete_node(conn, parent, node); + fire_watches(conn, ctx, name, false); + return delete_node(conn, ctx, parent, node); } --- xen-4.7.6-testing.orig/tools/xenstore/xenstored_watch.c +++ xen-4.7.6-testing/tools/xenstore/xenstored_watch.c @@ -122,7 +122,7 @@ static void add_event(struct connection * Temporary memory allocations are done with ctx. */ void fire_watches(struct connection *conn, const void *ctx, const char *name, - bool recurse) + bool exact) { struct connection *i; struct watch *watch; @@ -134,10 +134,13 @@ void fire_watches(struct connection *con /* Create an event for each watch. */ list_for_each_entry(i, &connections, list) { list_for_each_entry(watch, &i->watches, list) { - if (is_child(name, watch->node)) - add_event(i, ctx, watch, name); - else if (recurse && is_child(watch->node, name)) - add_event(i, ctx, watch, watch->node); + if (exact) { + if (streq(name, watch->node)) + add_event(i, ctx, watch, name); + } else { + if (is_child(name, watch->node)) + add_event(i, ctx, watch, name); + } } } } --- xen-4.7.6-testing.orig/tools/xenstore/xenstored_watch.h +++ xen-4.7.6-testing/tools/xenstore/xenstored_watch.h @@ -24,9 +24,9 @@ int do_watch(struct connection *conn, struct buffered_data *in); int do_unwatch(struct connection *conn, struct buffered_data *in); -/* Fire all watches: recurse means all the children are affected (ie. rm). */ +/* Fire all watches: !exact means all the children are affected (ie. rm). */ void fire_watches(struct connection *conn, const void *tmp, const char *name, - bool recurse); + bool exact); void conn_delete_all_watches(struct connection *conn);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor