tools/xenstore: add helpers to free struct buffered_data
authorJuergen Gross <jgross@suse.com>
Tue, 13 Sep 2022 05:35:07 +0000 (07:35 +0200)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Tue, 1 Nov 2022 13:05:44 +0000 (13:05 +0000)
Add two helpers for freeing struct buffered_data: free_buffered_data()
for freeing one instance and conn_free_buffered_data() for freeing all
instances for a connection.

This is avoiding duplicated code and will help later when more actions
are needed when freeing a struct buffered_data.

This is part of XSA-326.

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

index ed742d9dfc2e7935543d17c36959a6fa4e59511e..61fc368e8c2885b55186d01f7826febc18d10e9a 100644 (file)
@@ -207,6 +207,21 @@ void reopen_log(void)
        }
 }
 
+static void free_buffered_data(struct buffered_data *out,
+                              struct connection *conn)
+{
+       list_del(&out->list);
+       talloc_free(out);
+}
+
+void conn_free_buffered_data(struct connection *conn)
+{
+       struct buffered_data *out;
+
+       while ((out = list_top(&conn->out_list, struct buffered_data, list)))
+               free_buffered_data(out, conn);
+}
+
 static bool write_messages(struct connection *conn)
 {
        int ret;
@@ -250,8 +265,7 @@ static bool write_messages(struct connection *conn)
 
        trace_io(conn, out, 1);
 
-       list_del(&out->list);
-       talloc_free(out);
+       free_buffered_data(out, conn);
 
        return true;
 }
index 99a0373944b295c0c18ed6939193be41c50ae213..c9ea796185e86f0a025a347eeab7cbe79ef94d97 100644 (file)
@@ -271,6 +271,8 @@ int remember_string(struct hashtable *hash, const char *str);
 
 void set_tdb_key(const char *name, TDB_DATA *key);
 
+void conn_free_buffered_data(struct connection *conn);
+
 const char *dump_state_global(FILE *fp);
 const char *dump_state_buffered_data(FILE *fp, const struct connection *c,
                                     struct xs_state_connection *sc);
index ead4c237d233edfe6b9c105b214490c958722b2b..de349e2a77a5e7aad5530cb1f416d2391f901cb0 100644 (file)
@@ -411,15 +411,10 @@ static struct domain *find_domain_by_domid(unsigned int domid)
 static void domain_conn_reset(struct domain *domain)
 {
        struct connection *conn = domain->conn;
-       struct buffered_data *out;
 
        conn_delete_all_watches(conn);
        conn_delete_all_transactions(conn);
-
-       while ((out = list_top(&conn->out_list, struct buffered_data, list))) {
-               list_del(&out->list);
-               talloc_free(out);
-       }
+       conn_free_buffered_data(conn);
 
        talloc_free(conn->in);
 
@@ -436,8 +431,6 @@ static void domain_conn_reset(struct domain *domain)
  */
 void ignore_connection(struct connection *conn, unsigned int err)
 {
-       struct buffered_data *out, *tmp;
-
        trace("CONN %p ignored, reason %u\n", conn, err);
 
        if (conn->domain && conn->domain->interface)
@@ -446,11 +439,7 @@ void ignore_connection(struct connection *conn, unsigned int err)
        conn->is_ignored = true;
        conn_delete_all_watches(conn);
        conn_delete_all_transactions(conn);
-
-       list_for_each_entry_safe(out, tmp, &conn->out_list, list) {
-               list_del(&out->list);
-               talloc_free(out);
-       }
+       conn_free_buffered_data(conn);
 
        talloc_free(conn->in);
        conn->in = NULL;