tools/xenstore: move the call of setup_structure() to dom0 introduction
authorJuergen Gross <jgross@suse.com>
Tue, 13 Sep 2022 05:35:09 +0000 (07:35 +0200)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Tue, 1 Nov 2022 13:05:44 +0000 (13:05 +0000)
Setting up the basic structure when introducing dom0 has the advantage
to be able to add proper node memory accounting for the added nodes
later.

This makes it possible to do proper node accounting, too.

An additional requirement to make that work fine is to correct the
owner of the created nodes to be dom0_domid instead of domid 0.

This is part of XSA-326.

Signed-off-by: Juergen Gross <jgross@suse.com>
Acked-by: Julien Grall <jgrall@amazon.com>
tools/xenstore/xenstored_core.c
tools/xenstore/xenstored_core.h
tools/xenstore/xenstored_domain.c

index d4fd005f599ddfb5ac3f1b3f086bdc45f9313c25..844ae396a0d5d427390403a61f86ae873633332e 100644 (file)
@@ -2018,7 +2018,8 @@ static int tdb_flags;
 static void manual_node(const char *name, const char *child)
 {
        struct node *node;
-       struct xs_permissions perms = { .id = 0, .perms = XS_PERM_NONE };
+       struct xs_permissions perms = { .id = dom0_domid,
+                                       .perms = XS_PERM_NONE };
 
        node = talloc_zero(NULL, struct node);
        if (!node)
@@ -2057,7 +2058,7 @@ static void tdb_logger(TDB_CONTEXT *tdb, int level, const char * fmt, ...)
        }
 }
 
-static void setup_structure(bool live_update)
+void setup_structure(bool live_update)
 {
        char *tdbname;
 
@@ -2080,6 +2081,7 @@ static void setup_structure(bool live_update)
                manual_node("/", "tool");
                manual_node("/tool", "xenstored");
                manual_node("/tool/xenstored", NULL);
+               domain_entry_fix(dom0_domid, 3, true);
        }
 
        check_store();
@@ -2598,9 +2600,6 @@ int main(int argc, char *argv[])
 
        init_pipe(reopen_log_pipe);
 
-       /* Setup the database */
-       setup_structure(live_update);
-
        /* Listen to hypervisor. */
        if (!no_domain_init && !live_update) {
                domain_init(-1);
index 9c572a3c6e2ad55d35249d5194db69ac1b4f688b..a772f3b8ead2a29899980b60c944ba2e672c16df 100644 (file)
@@ -231,6 +231,7 @@ int write_node_raw(struct connection *conn, TDB_DATA *key, struct node *node,
 struct node *read_node(struct connection *conn, const void *ctx,
                       const char *name);
 
+void setup_structure(bool live_update);
 struct connection *new_connection(const struct interface_funcs *funcs);
 struct connection *get_connection_by_id(unsigned int conn_id);
 void check_store(void);
index 44ce267ec557f797275c9073d799348bb034da4b..5c79eed3dc34dc118b0e2b561f52bb0433b9c077 100644 (file)
@@ -496,6 +496,9 @@ static struct domain *introduce_domain(const void *ctx,
                }
                domain->interface = interface;
 
+               if (is_master_domain)
+                       setup_structure(restore);
+
                /* Now domain belongs to its connection. */
                talloc_steal(domain->conn, domain);