tools/xenstore: add helpers to free struct buffered_data

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>
(cherry picked from commit ead062a68a)
This commit is contained in:
Juergen Gross authored and Andrew Cooper committed 2022-11-01 15:20:41 +00:00
1 parent 00240cfc5e
commit 3530aa6aca
3 files changed
+20 -15

No files matched your search

+17 -9
View File
@@ -208,6 +208,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;
@@ -251,8 +266,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;
}
@@ -1391,18 +1405,12 @@ static struct {
*/
static void ignore_connection(struct connection *conn)
{
struct buffered_data *out, *tmp;
trace("CONN %p ignored\n", conn);
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;
+2
View File
@@ -226,6 +226,8 @@ extern xengnttab_handle **xgt_handle;
int remember_string(struct hashtable *hash, const char *str);
void conn_free_buffered_data(struct connection *conn);
#endif /* _XENSTORED_CORE_H */
/*
+1 -6
View File
@@ -402,15 +402,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);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.