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; } }