diff options
-rw-r--r-- | src/login1.c | 33 | ||||
-rw-r--r-- | src/login1.h | 2 | ||||
-rw-r--r-- | src/session.c | 5 |
3 files changed, 40 insertions, 0 deletions
diff --git a/src/login1.c b/src/login1.c index dc60a492..73d2d8b9 100644 --- a/src/login1.c +++ b/src/login1.c @@ -437,6 +437,39 @@ login1_service_activate_session (Login1Service *service, const gchar *session_id } } +void +login1_service_terminate_session (Login1Service *service, const gchar *session_id) +{ + GError *error = NULL; + + g_return_if_fail (service != NULL); + g_return_if_fail (session_id != NULL); + + g_debug ("Terminating login1 session %s", session_id); + + if (session_id) + { + GVariant *result; + + result = g_dbus_connection_call_sync (service->priv->connection, + LOGIN1_SERVICE_NAME, + LOGIN1_OBJECT_NAME, + LOGIN1_MANAGER_INTERFACE_NAME, + "TerminateSession", + g_variant_new ("(s)", session_id), + G_VARIANT_TYPE ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + if (error) + g_warning ("Error terminating login1 session: %s", error->message); + g_clear_error (&error); + if (result) + g_variant_unref (result); + } +} + static void login1_service_init (Login1Service *service) { diff --git a/src/login1.h b/src/login1.h index e34e806b..9377dba8 100644 --- a/src/login1.h +++ b/src/login1.h @@ -78,6 +78,8 @@ void login1_service_unlock_session (Login1Service *service, const gchar *session void login1_service_activate_session (Login1Service *service, const gchar *session_id); +void login1_service_terminate_session (Login1Service *service, const gchar *session_id); + const gchar *login1_seat_get_id (Login1Seat *seat); gboolean login1_seat_get_can_graphical (Login1Seat *seat); diff --git a/src/session.c b/src/session.c index 5e7d4767..15598425 100644 --- a/src/session.c +++ b/src/session.c @@ -913,6 +913,11 @@ session_stop (Session *session) { g_return_if_fail (session != NULL); + /* Kill remaining processes in our logind session to avoid them leaking + * to the user session (they share the same $DISPLAY) */ + if (getuid () == 0 && session->priv->login1_session_id) + login1_service_terminate_session (login1_service_get_instance (), session->priv->login1_session_id); + /* If can cleanly stop then do that */ if (session_get_is_authenticated (session) && !session->priv->command_run) { |