]> xenbits.xensource.com Git - xen.git/commitdiff
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 15:20:41 +0000 (15:20 +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>
(cherry picked from commit 60e2f6020dea7f616857b8fc1141b1c085d88761)

tools/xenstore/xenstored_core.c
tools/xenstore/xenstored_core.h
tools/xenstore/xenstored_domain.c

index ff649b7544db2ea7b7682d58dae44a02953ba32d..8123a65a58bf2cf22e56cdbb187c7a56aebdfa60 100644 (file)
@@ -1834,7 +1834,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)
@@ -1873,7 +1874,7 @@ static void tdb_logger(TDB_CONTEXT *tdb, int level, const char * fmt, ...)
        }
 }
 
-static void setup_structure(void)
+void setup_structure(void)
 {
        char *tdbname;
        tdbname = talloc_strdup(talloc_autofree_context(), xs_daemon_tdb());
@@ -1891,6 +1892,7 @@ static void setup_structure(void)
        manual_node("/", "tool");
        manual_node("/tool", "xenstored");
        manual_node("/tool/xenstored", NULL);
+       domain_entry_fix(dom0_domid, 3, true);
 
        check_store();
 }
@@ -2389,9 +2391,6 @@ int main(int argc, char *argv[])
 
        init_pipe(reopen_log_pipe);
 
-       /* Setup the database */
-       setup_structure();
-
        /* Listen to hypervisor. */
        if (!no_domain_init)
                domain_init();
index 7e371253d2d10ad8cf863901176884a290d0ffe7..d95e4262a91eee5ba17860a49306e4084a5f84cd 100644 (file)
@@ -195,6 +195,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(void);
 struct connection *new_connection(connwritefn_t *write, connreadfn_t *read);
 void check_store(void);
 void corrupt(struct connection *conn, const char *fmt, ...);
index 306e12358bf988f6ca1bed35d6cf489792030dd4..bed6c4e05a9bdb698da0e4ba5de1156cb88e9186 100644 (file)
@@ -732,6 +732,8 @@ static int dom0_init(void)
        if (dom0->interface == NULL)
                return -1;
 
+       setup_structure();
+
        talloc_steal(dom0->conn, dom0); 
 
        xenevtchn_notify(xce_handle, dom0->port);