File vdagentd-Automatically-release-agent_data.patch of Package spice-vdagent.17026

From adc7b4a87e82e20a89ba6c047879a36515d33fde Mon Sep 17 00:00:00 2001
From: Frediano Ziglio <freddy77@gmail.com>
Date: Mon, 21 Sep 2020 07:00:39 +0100
Subject: [PATCH 09/20] vdagentd: Automatically release "agent_data"
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Git-commit: b4479eb9b0a30cf99806a17bcbdc468828727e89
References: bsc#1173749

It's not guaranteed that agent_disconnect will release the connection
so avoid to have a dandling pointer.

Signed-off-by: Frediano Ziglio <freddy77@gmail.com>
Acked-by: Jakub Janků <jjanku@redhat.com>
Signed-off-by: Bruce Rogers <brogers@suse.com>
---
 src/vdagentd/vdagentd.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/src/vdagentd/vdagentd.c b/src/vdagentd/vdagentd.c
index 9b508d2..c5a2fe7 100644
--- a/src/vdagentd/vdagentd.c
+++ b/src/vdagentd/vdagentd.c
@@ -85,6 +85,13 @@ static int max_clipboard = -1;
 
 static GMainLoop *loop;
 
+static void agent_data_destroy(struct agent_data *agent_data)
+{
+    g_free(agent_data->session);
+    g_free(agent_data->screen_info);
+    g_free(agent_data);
+}
+
 static void vdagentd_quit(gint exit_code)
 {
     retval = exit_code;
@@ -891,7 +898,7 @@ static void agent_connect(struct udscs_connection *conn)
             syslog(LOG_ERR, "Could not get peer PID, disconnecting new client: %s",
                             err->message);
             g_error_free(err);
-            g_free(agent_data);
+            agent_data_destroy(agent_data);
             udscs_server_destroy_connection(server, conn);
             return;
         }
@@ -899,7 +906,8 @@ static void agent_connect(struct udscs_connection *conn)
         agent_data->session = session_info_session_for_pid(session_info, pid);
     }
 
-    g_object_set_data(G_OBJECT(conn), "agent_data", agent_data);
+    g_object_set_data_full(G_OBJECT(conn), "agent_data", agent_data,
+                           (GDestroyNotify) agent_data_destroy);
     udscs_write(conn, VDAGENTD_VERSION, 0, 0,
                 (uint8_t *)VERSION, strlen(VERSION) + 1);
     update_active_session_connection(conn);
@@ -912,13 +920,8 @@ static void agent_connect(struct udscs_connection *conn)
 
 static void agent_disconnect(VDAgentConnection *conn, GError *err)
 {
-    struct agent_data *agent_data = g_object_get_data(G_OBJECT(conn), "agent_data");
-
     g_hash_table_foreach_remove(active_xfers, remove_active_xfers, conn);
 
-    g_clear_pointer(&agent_data->session, g_free);
-    g_free(agent_data->screen_info);
-    g_free(agent_data);
     if (err) {
         syslog(LOG_ERR, "%s", err->message);
         g_error_free(err);
-- 
2.29.0

openSUSE Build Service is sponsored by