tools/xenstore: don't let special watches be children of /
authorJuergen Gross <jgross@suse.com>
Mon, 2 May 2022 10:07:22 +0000 (12:07 +0200)
committerJulien Grall <jgrall@amazon.com>
Thu, 5 May 2022 10:58:47 +0000 (11:58 +0100)
When firing special watches (e.g. "@releaseDomain"), they will be
regarded to be valid children of the "/" node. So a domain having
registered a watch for "/" and having the privilege to receive
the special watches will receive those special watch events for the
registered "/" watch.

Fix that by calling the related fire_watches() with the "exact"
parameter set to true, causing a mismatch for the "/" node.

Reported-by: Raphael Ning <raphning@amazon.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Raphael Ning <raphning@amazon.com>
Reviewed-by: Julien Grall <jgrall@amazon.com>
tools/xenstore/xenstored_domain.c

index ae065fcbee8de7dfcb1b2245bf9c65223f93625c..80ba1d627b2ee2d0966b5ae3c573a85d22041b5c 100644 (file)
@@ -231,7 +231,7 @@ static int destroy_domain(void *_domain)
                        unmap_interface(domain->interface);
        }
 
-       fire_watches(NULL, domain, "@releaseDomain", NULL, false, NULL);
+       fire_watches(NULL, domain, "@releaseDomain", NULL, true, NULL);
 
        wrl_domain_destroy(domain);
 
@@ -282,7 +282,7 @@ void check_domains(void)
        }
 
        if (notify)
-               fire_watches(NULL, NULL, "@releaseDomain", NULL, false, NULL);
+               fire_watches(NULL, NULL, "@releaseDomain", NULL, true, NULL);
 }
 
 /* We scan all domains rather than use the information given here. */
@@ -495,7 +495,7 @@ static struct domain *introduce_domain(const void *ctx,
 
                if (!is_master_domain && !restore)
                        fire_watches(NULL, ctx, "@introduceDomain", NULL,
-                                    false, NULL);
+                                    true, NULL);
        } else {
                /* Use XS_INTRODUCE for recreating the xenbus event-channel. */
                if (domain->port)