Sophie

Sophie

distrib > Mageia > 7 > armv7hl > media > core-updates-src > by-pkgid > e9079d0783cd29dee2d067ee653cafdd > files > 6

spice-vdagent-0.19.0-1.1.mga7.src.rpm

Backport of:

From cb15e7c8052cae75272bbd0d6a5cac37efa360f8 Mon Sep 17 00:00:00 2001
From: Frediano Ziglio <freddy77@gmail.com>
Date: Thu, 24 Sep 2020 12:13:44 +0100
Subject: [PATCH 07/10] vdagentd: Limit number of agents per session to 1

Signed-off-by: Frediano Ziglio <freddy77@gmail.com>
Acked-by: Uri Lublin <uril@redhat.com>
---
 src/vdagentd/vdagentd.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

--- a/src/vdagentd/vdagentd.c
+++ b/src/vdagentd/vdagentd.c
@@ -891,6 +891,20 @@ static gboolean check_uid_of_pid(pid_t p
     return TRUE;
 }
 
+/* Check if this connection matches the passed session */
+static int connection_matches_session(struct udscs_connection **connp, void *priv)
+{
+    const char *session = priv;
+    struct agent_data *agent_data = udscs_get_user_data(*connp);
+
+    if (!agent_data || !agent_data->session ||
+        strcmp(agent_data->session, session) != 0) {
+        return 0;
+    }
+
+    return 1;
+}
+
 static void agent_connect(struct udscs_connection *conn)
 {
     struct agent_data *agent_data;
@@ -917,6 +931,16 @@ static void agent_connect(struct udscs_c
             udscs_set_user_data(conn, (void *)agent_data);
             udscs_destroy_connection(&conn);
             return;
+        }
+
+        // Check there are no other connection for this session
+        // Note that "conn" is not counted as "agent_data" is still not attached to it
+        if (udscs_server_for_all_clients(server, connection_matches_session,
+                                         agent_data->session) > 0) {
+            syslog(LOG_ERR, "An agent is already connected for this session");
+            udscs_set_user_data(conn, (void *)agent_data);
+            udscs_destroy_connection(&conn);
+            return;
         }
     }