summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/configuration.c4
-rw-r--r--common/user-list.c7
-rw-r--r--liblightdm-gobject/greeter.c3
-rw-r--r--src/accounts.c14
-rw-r--r--src/display-manager.c4
-rw-r--r--src/display-server.c4
-rw-r--r--src/greeter.c7
-rw-r--r--src/lightdm.c3
-rw-r--r--src/login1.c2
-rw-r--r--src/mir-server.c10
-rw-r--r--src/process.c4
-rw-r--r--src/seat-unity.c12
-rw-r--r--src/seat-xdmcp-session.c6
-rw-r--r--src/seat-xvnc.c6
-rw-r--r--src/seat.c141
-rw-r--r--src/session.c25
-rw-r--r--src/shared-data-manager.c19
-rw-r--r--src/unity-system-compositor.c4
-rw-r--r--src/vnc-server.c10
-rw-r--r--src/wayland-session.c4
-rw-r--r--src/x-authority.c4
-rw-r--r--src/x-server-local.c4
-rw-r--r--src/x-server-xvnc.c10
-rw-r--r--src/x-server.c12
-rw-r--r--src/xdmcp-server.c10
-rw-r--r--src/xdmcp-session.c10
-rw-r--r--tests/Makefile.am4
-rw-r--r--tests/scripts/lock-seat-after-vt-switch.conf22
-rw-r--r--tests/scripts/lock-seat-twice.conf75
-rw-r--r--tests/scripts/lock-session-twice.conf77
-rwxr-xr-xtests/test-lock-seat-twice2
-rwxr-xr-xtests/test-lock-session-twice2
32 files changed, 305 insertions, 216 deletions
diff --git a/common/configuration.c b/common/configuration.c
index 895085e3..dc7831a8 100644
--- a/common/configuration.c
+++ b/common/configuration.c
@@ -331,9 +331,7 @@ config_init (Configuration *config)
static void
config_finalize (GObject *object)
{
- Configuration *self;
-
- self = CONFIGURATION (object);
+ Configuration *self = CONFIGURATION (object);
g_free (self->priv->dir);
g_key_file_free (self->priv->key_file);
diff --git a/common/user-list.c b/common/user-list.c
index 792c6d3a..1b198d1a 100644
--- a/common/user-list.c
+++ b/common/user-list.c
@@ -186,9 +186,7 @@ common_user_list_get_instance (void)
void
common_user_list_cleanup (void)
{
- if (singleton)
- g_object_unref (singleton);
- singleton = NULL;
+ g_clear_object (&singleton);
}
static CommonUser *
@@ -1059,8 +1057,7 @@ common_user_list_finalize (GObject *object)
if (priv->session_removed_signal)
g_dbus_connection_signal_unsubscribe (priv->bus, priv->session_removed_signal);
g_object_unref (priv->bus);
- if (priv->passwd_monitor)
- g_object_unref (priv->passwd_monitor);
+ g_clear_object (&priv->passwd_monitor);
G_OBJECT_CLASS (common_user_list_parent_class)->finalize (object);
}
diff --git a/liblightdm-gobject/greeter.c b/liblightdm-gobject/greeter.c
index bcddf154..e507b654 100644
--- a/liblightdm-gobject/greeter.c
+++ b/liblightdm-gobject/greeter.c
@@ -1952,8 +1952,7 @@ request_finalize (GObject *object)
Request *request = REQUEST (object);
g_free (request->dir);
- if (request->cancellable)
- g_object_unref (request->cancellable);
+ g_clear_object (&request->cancellable);
G_OBJECT_CLASS (request_parent_class)->finalize (object);
}
diff --git a/src/accounts.c b/src/accounts.c
index d4d54a2e..77cfdf5e 100644
--- a/src/accounts.c
+++ b/src/accounts.c
@@ -122,17 +122,13 @@ user_init (User *user)
}
static void
-user_dispose (GObject *object)
+user_finalize (GObject *object)
{
- User *self;
+ User *self = USER (object);
- self = USER (object);
+ g_clear_object (&self->priv->common_user);
- if (self->priv->common_user)
- g_object_unref (self->priv->common_user);
- self->priv->common_user = NULL;
-
- G_OBJECT_CLASS (user_parent_class)->dispose (object);
+ G_OBJECT_CLASS (user_parent_class)->finalize (object);
}
static void
@@ -140,7 +136,7 @@ user_class_init (UserClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
- object_class->dispose = user_dispose;
+ object_class->finalize = user_finalize;
g_type_class_add_private (klass, sizeof (UserPrivate));
}
diff --git a/src/display-manager.c b/src/display-manager.c
index b683fdaa..af9f43a4 100644
--- a/src/display-manager.c
+++ b/src/display-manager.c
@@ -170,11 +170,9 @@ display_manager_init (DisplayManager *manager)
static void
display_manager_finalize (GObject *object)
{
- DisplayManager *self;
+ DisplayManager *self = DISPLAY_MANAGER (object);
GList *link;
- self = DISPLAY_MANAGER (object);
-
for (link = self->priv->seats; link; link = link->next)
{
Seat *seat = link->data;
diff --git a/src/display-server.c b/src/display-server.c
index 336a6eed..7821b6ab 100644
--- a/src/display-server.c
+++ b/src/display-server.c
@@ -154,9 +154,7 @@ display_server_init (DisplayServer *server)
static void
display_server_finalize (GObject *object)
{
- DisplayServer *self;
-
- self = DISPLAY_SERVER (object);
+ DisplayServer *self = DISPLAY_SERVER (object);
g_free (self->priv->name);
diff --git a/src/greeter.c b/src/greeter.c
index b9f4f55a..db52a43d 100644
--- a/src/greeter.c
+++ b/src/greeter.c
@@ -412,8 +412,7 @@ reset_session (Greeter *greeter)
{
g_signal_handlers_disconnect_matched (greeter->priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter);
session_stop (greeter->priv->authentication_session);
- g_object_unref (greeter->priv->authentication_session);
- greeter->priv->authentication_session = NULL;
+ g_clear_object (&greeter->priv->authentication_session);
}
greeter->priv->guest_account_authenticated = FALSE;
@@ -1043,9 +1042,7 @@ greeter_init (Greeter *greeter)
static void
greeter_finalize (GObject *object)
{
- Greeter *self;
-
- self = GREETER (object);
+ Greeter *self = GREETER (object);
g_free (self->priv->pam_service);
g_free (self->priv->autologin_pam_service);
diff --git a/src/lightdm.c b/src/lightdm.c
index 72f7eb0c..d9ec9aff 100644
--- a/src/lightdm.c
+++ b/src/lightdm.c
@@ -1539,8 +1539,7 @@ main (int argc, char **argv)
common_user_list_cleanup ();
/* Clean up display manager */
- g_object_unref (display_manager);
- display_manager = NULL;
+ g_clear_object (&display_manager);
/* Remove D-Bus interface */
g_dbus_connection_unregister_object (bus, reg_id);
diff --git a/src/login1.c b/src/login1.c
index af8e8a8e..dc60a492 100644
--- a/src/login1.c
+++ b/src/login1.c
@@ -450,7 +450,7 @@ login1_service_finalize (GObject *object)
g_list_free_full (self->priv->seats, g_object_unref);
g_dbus_connection_signal_unsubscribe (self->priv->connection, self->priv->signal_id);
- g_object_unref (self->priv->connection);
+ g_clear_object (&self->priv->connection);
G_OBJECT_CLASS (login1_service_parent_class)->finalize (object);
}
diff --git a/src/mir-server.c b/src/mir-server.c
index 36e0e770..303f3d56 100644
--- a/src/mir-server.c
+++ b/src/mir-server.c
@@ -99,13 +99,11 @@ mir_server_init (MirServer *server)
static void
mir_server_finalize (GObject *object)
{
- MirServer *server;
-
- server = MIR_SERVER (object);
+ MirServer *self = MIR_SERVER (object);
- if (server->priv->vt > 0)
- vt_unref (server->priv->vt);
- g_free (server->priv->parent_socket);
+ if (self->priv->vt > 0)
+ vt_unref (self->priv->vt);
+ g_free (self->priv->parent_socket);
G_OBJECT_CLASS (mir_server_parent_class)->finalize (object);
}
diff --git a/src/process.c b/src/process.c
index 50c0a9b0..ebd12743 100644
--- a/src/process.c
+++ b/src/process.c
@@ -359,9 +359,7 @@ process_stopped (Process *process)
static void
process_finalize (GObject *object)
{
- Process *self;
-
- self = PROCESS (object);
+ Process *self = PROCESS (object);
if (self->priv->pid > 0)
g_hash_table_remove (processes, GINT_TO_POINTER (self->priv->pid));
diff --git a/src/seat-unity.c b/src/seat-unity.c
index 642be0aa..409c0a46 100644
--- a/src/seat-unity.c
+++ b/src/seat-unity.c
@@ -140,8 +140,7 @@ compositor_stopped_cb (UnitySystemCompositor *compositor, SeatUnity *seat)
{
l_debug (seat, "Compositor stopped");
- g_object_unref (seat->priv->compositor);
- seat->priv->compositor = NULL;
+ g_clear_object (&seat->priv->compositor);
if (seat_get_is_stopping (SEAT (seat)))
check_stopped (seat);
@@ -421,17 +420,14 @@ seat_unity_finalize (GObject *object)
{
SeatUnity *seat = SEAT_UNITY (object);
- if (seat->priv->compositor)
- g_object_unref (seat->priv->compositor);
+ g_clear_object (&seat->priv->compositor);
if (seat->priv->xdmcp_x_server)
{
g_signal_handlers_disconnect_matched (seat->priv->xdmcp_x_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat);
g_object_unref (seat->priv->xdmcp_x_server);
}
- if (seat->priv->active_session)
- g_object_unref (seat->priv->active_session);
- if (seat->priv->active_display_server)
- g_object_unref (seat->priv->active_display_server);
+ g_clear_object (&seat->priv->active_session);
+ g_clear_object (&seat->priv->active_display_server);
G_OBJECT_CLASS (seat_unity_parent_class)->finalize (object);
}
diff --git a/src/seat-xdmcp-session.c b/src/seat-xdmcp-session.c
index 7621a97b..41998279 100644
--- a/src/seat-xdmcp-session.c
+++ b/src/seat-xdmcp-session.c
@@ -60,11 +60,9 @@ seat_xdmcp_session_init (SeatXDMCPSession *seat)
static void
seat_xdmcp_session_finalize (GObject *object)
{
- SeatXDMCPSession *self;
+ SeatXDMCPSession *self = SEAT_XDMCP_SESSION (object);
- self = SEAT_XDMCP_SESSION (object);
-
- g_object_unref (self->priv->session);
+ g_clear_object (&self->priv->session);
G_OBJECT_CLASS (seat_xdmcp_session_parent_class)->finalize (object);
}
diff --git a/src/seat-xvnc.c b/src/seat-xvnc.c
index 00f5f693..93e0e13f 100644
--- a/src/seat-xvnc.c
+++ b/src/seat-xvnc.c
@@ -101,11 +101,9 @@ seat_xvnc_init (SeatXVNC *seat)
static void
seat_xdmcp_session_finalize (GObject *object)
{
- SeatXVNC *self;
+ SeatXVNC *self = SEAT_XVNC (object);
- self = SEAT_XVNC (object);
-
- g_object_unref (self->priv->connection);
+ g_clear_object (&self->priv->connection);
G_OBJECT_CLASS (seat_xvnc_parent_class)->finalize (object);
}
diff --git a/src/seat.c b/src/seat.c
index 33b73152..2e2afd0a 100644
--- a/src/seat.c
+++ b/src/seat.c
@@ -65,6 +65,9 @@ struct SeatPrivate
/* TRUE if stopped */
gboolean stopped;
+
+ /* The greeter to be started to replace the current one */
+ Greeter *replacement_greeter;
};
static void seat_logger_iface_init (LoggerInterface *iface);
@@ -244,14 +247,11 @@ seat_set_active_session (Seat *seat, Session *session)
}
/* Lock previous sessions */
- if (seat->priv->active_session)
- {
- if (session != seat->priv->active_session && !IS_GREETER (seat->priv->active_session))
- session_lock (seat->priv->active_session);
- g_object_unref (seat->priv->active_session);
- }
+ if (seat->priv->active_session && session != seat->priv->active_session && !IS_GREETER (seat->priv->active_session))
+ session_lock (seat->priv->active_session);
session_activate (session);
+ g_clear_object (&seat->priv->active_session);
seat->priv->active_session = g_object_ref (session);
}
@@ -297,8 +297,7 @@ void
seat_set_externally_activated_session (Seat *seat, Session *session)
{
g_return_if_fail (seat != NULL);
- if (seat->priv->active_session)
- g_object_unref (seat->priv->active_session);
+ g_clear_object (&seat->priv->active_session);
seat->priv->active_session = g_object_ref (session);
}
@@ -565,8 +564,7 @@ switch_to_greeter_from_failed_session (Seat *seat, Session *session)
}
else
{
- if (seat->priv->session_to_activate)
- g_object_unref (seat->priv->session_to_activate);
+ g_clear_object (&seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (greeter_session);
if (can_share_display_server (seat, session_get_display_server (session)))
@@ -651,8 +649,7 @@ run_session (Seat *seat, Session *session)
if (session == seat->priv->session_to_activate)
{
seat_set_active_session (seat, session);
- g_object_unref (seat->priv->session_to_activate);
- seat->priv->session_to_activate = NULL;
+ g_clear_object (&seat->priv->session_to_activate);
}
else if (seat->priv->active_session)
{
@@ -696,8 +693,7 @@ greeter_active_username_changed_cb (Greeter *greeter, GParamSpec *pspec, Seat *s
session = find_user_session (seat, greeter_get_active_username (greeter), seat->priv->active_session);
- if (seat->priv->next_session)
- g_object_unref (seat->priv->next_session);
+ g_clear_object (&seat->priv->next_session);
seat->priv->next_session = session ? g_object_ref (session) : NULL;
SEAT_GET_CLASS (seat)->set_next_session (seat, session);
@@ -745,20 +741,11 @@ session_stopped_cb (Session *session, Seat *seat)
g_signal_handlers_disconnect_matched (session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat);
seat->priv->sessions = g_list_remove (seat->priv->sessions, session);
if (session == seat->priv->active_session)
- {
- g_object_unref (seat->priv->active_session);
- seat->priv->active_session = NULL;
- }
+ g_clear_object (&seat->priv->active_session);
if (session == seat->priv->next_session)
- {
- g_object_unref (seat->priv->next_session);
- seat->priv->next_session = NULL;
- }
+ g_clear_object (&seat->priv->next_session);
if (session == seat->priv->session_to_activate)
- {
- g_object_unref (seat->priv->session_to_activate);
- seat->priv->session_to_activate = NULL;
- }
+ g_clear_object (&seat->priv->session_to_activate);
display_server = session_get_display_server (session);
if (!display_server)
@@ -779,10 +766,7 @@ session_stopped_cb (Session *session, Seat *seat)
/* We were waiting for this session, but it didn't start :( */
// FIXME: Start a greeter on this?
if (session == seat->priv->session_to_activate)
- {
- g_object_unref (seat->priv->session_to_activate);
- seat->priv->session_to_activate = NULL;
- }
+ g_clear_object (&seat->priv->session_to_activate);
if (seat->priv->stopping)
{
@@ -790,9 +774,28 @@ session_stopped_cb (Session *session, Seat *seat)
g_object_unref (session);
return;
}
+
+ /* If there is a pending replacement greeter, start it */
+ if (IS_GREETER (session) && seat->priv->replacement_greeter)
+ {
+ Greeter *replacement_greeter = seat->priv->replacement_greeter;
+ seat->priv->replacement_greeter = NULL;
+
+ if (session_get_is_authenticated (SESSION (replacement_greeter)))
+ {
+ l_debug (seat, "Greeter stopped, running session");
+ run_session (seat, SESSION (replacement_greeter));
+ }
+ else
+ {
+ l_debug (seat, "Greeter stopped, starting session authentication");
+ start_session (seat, SESSION (replacement_greeter));
+ }
+ g_object_unref (replacement_greeter);
+ }
/* If this is the greeter session then re-use this display server */
- if (IS_GREETER (session) &&
+ else if (IS_GREETER (session) &&
can_share_display_server (seat, display_server) &&
greeter_get_start_session (GREETER (session)))
{
@@ -1200,8 +1203,7 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi
}
/* Switch to this session when it is ready */
- if (seat->priv->session_to_activate)
- g_object_unref (seat->priv->session_to_activate);
+ g_clear_object (&seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (session);
/* Return to existing session if it is open */
@@ -1432,8 +1434,7 @@ seat_switch_to_greeter (Seat *seat)
if (!greeter_session)
return FALSE;
- if (seat->priv->session_to_activate)
- g_object_unref (seat->priv->session_to_activate);
+ g_clear_object (&seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (greeter_session);
display_server = create_display_server (seat, SESSION (greeter_session));
@@ -1465,8 +1466,7 @@ switch_authentication_complete_cb (Session *session, Seat *seat)
else
{
l_debug (seat, "Session authenticated, starting display server");
- if (seat->priv->session_to_activate)
- g_object_unref (seat->priv->session_to_activate);
+ g_clear_object (&seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (session);
display_server = create_display_server (seat, session);
session_set_display_server (session, display_server);
@@ -1504,8 +1504,7 @@ switch_authentication_complete_cb (Session *session, Seat *seat)
}
else
{
- if (seat->priv->session_to_activate)
- g_object_unref (seat->priv->session_to_activate);
+ g_clear_object (&seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (greeter_session);
display_server = create_display_server (seat, SESSION (greeter_session));
@@ -1581,8 +1580,7 @@ seat_switch_to_guest (Seat *seat, const gchar *session_name)
display_server = create_display_server (seat, session);
- if (seat->priv->session_to_activate)
- g_object_unref (seat->priv->session_to_activate);
+ g_clear_object (&seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (session);
session_set_pam_service (session, seat_get_string_property (seat, "pam-autologin-service"));
session_set_display_server (session, display_server);
@@ -1594,14 +1592,17 @@ gboolean
seat_lock (Seat *seat, const gchar *username)
{
Greeter *greeter_session;
- DisplayServer *display_server;
- gboolean existing = FALSE;
+ DisplayServer *display_server = NULL;
+ gboolean reset_existing = FALSE;
+ gboolean reuse_xserver = FALSE;
g_return_val_if_fail (seat != NULL, FALSE);
if (!seat_get_can_switch (seat))
return FALSE;
+ // FIXME: If already locked then don't bother...
+
l_debug (seat, "Locking");
/* Switch to greeter we can reuse */
@@ -1610,10 +1611,23 @@ seat_lock (Seat *seat, const gchar *username)
{
l_debug (seat, "Switching to existing greeter");
set_greeter_hints (seat, greeter_session);
- existing = TRUE;
+ reset_existing = TRUE;
}
else
{
+ /* If the existing greeter can't be reused, stop it and reuse its display server */
+ greeter_session = find_greeter_session (seat);
+ if (greeter_session)
+ {
+ display_server = session_get_display_server (SESSION (greeter_session));
+ if (!session_get_is_stopping (SESSION (greeter_session)))
+ {
+ l_debug (seat, "Stopping session");
+ session_stop (SESSION (greeter_session));
+ }
+ reuse_xserver = TRUE;
+ }
+
greeter_session = create_greeter_session (seat);
if (!greeter_session)
return FALSE;
@@ -1623,7 +1637,7 @@ seat_lock (Seat *seat, const gchar *username)
if (username)
greeter_set_hint (greeter_session, "select-user", username);
- if (existing)
+ if (reset_existing)
{
greeter_reset (greeter_session);
seat_set_active_session (seat, SESSION (greeter_session));
@@ -1631,14 +1645,21 @@ seat_lock (Seat *seat, const gchar *username)
}
else
{
- display_server = create_display_server (seat, SESSION (greeter_session));
+ if (!reuse_xserver)
+ display_server = create_display_server (seat, SESSION (greeter_session));
+ session_set_display_server (SESSION (greeter_session), display_server);
- if (seat->priv->session_to_activate)
- g_object_unref (seat->priv->session_to_activate);
+ g_clear_object (&seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (greeter_session);
- session_set_display_server (SESSION (greeter_session), display_server);
- return display_server_start (display_server);
+ if (reuse_xserver)
+ {
+ g_clear_object (&seat->priv->replacement_greeter);
+ seat->priv->replacement_greeter = g_object_ref (greeter_session);
+ return TRUE;
+ }
+ else
+ return display_server_start (display_server);
}
}
@@ -1706,8 +1727,7 @@ seat_real_start (Seat *seat)
{
DisplayServer *display_server;
- if (seat->priv->session_to_activate)
- g_object_unref (seat->priv->session_to_activate);
+ g_clear_object (&seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (session);
display_server = create_display_server (seat, session);
@@ -1736,8 +1756,7 @@ seat_real_start (Seat *seat)
return FALSE;
}
- if (seat->priv->session_to_activate)
- g_object_unref (seat->priv->session_to_activate);
+ g_clear_object (&seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (greeter_session);
session = SESSION (greeter_session);
@@ -1852,11 +1871,9 @@ seat_init (Seat *seat)
static void
seat_finalize (GObject *object)
{
- Seat *self;
+ Seat *self = SEAT (object);
GList *link;
- self = SEAT (object);
-
g_free (self->priv->name);
g_hash_table_unref (self->priv->properties);
for (link = self->priv->display_servers; link; link = link->next)
@@ -1871,12 +1888,10 @@ seat_finalize (GObject *object)
g_signal_handlers_disconnect_matched (session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self);
}
g_list_free_full (self->priv->sessions, g_object_unref);
- if (self->priv->active_session)
- g_object_unref (self->priv->active_session);
- if (self->priv->next_session)
- g_object_unref (self->priv->next_session);
- if (self->priv->session_to_activate)
- g_object_unref (self->priv->session_to_activate);
+ g_clear_object (&self->priv->active_session);
+ g_clear_object (&self->priv->next_session);
+ g_clear_object (&self->priv->session_to_activate);
+ g_clear_object (&self->priv->replacement_greeter);
G_OBJECT_CLASS (seat_parent_class)->finalize (object);
}
diff --git a/src/session.c b/src/session.c
index e25a69a5..f7f4ac09 100644
--- a/src/session.c
+++ b/src/session.c
@@ -135,8 +135,7 @@ session_set_config (Session *session, SessionConfig *config)
{
g_return_if_fail (session != NULL);
- if (session->priv->config)
- g_object_unref (session->priv->config);
+ g_clear_object (&session->priv->config);
session->priv->config = g_object_ref (config);
}
@@ -246,11 +245,7 @@ void
session_set_x_authority (Session *session, XAuthority *authority, gboolean use_system_location)
{
g_return_if_fail (session != NULL);
- if (session->priv->x_authority)
- {
- g_object_unref (session->priv->x_authority);
- session->priv->x_authority = NULL;
- }
+ g_clear_object (&session->priv->x_authority);
if (authority)
session->priv->x_authority = g_object_ref (authority);
session->priv->x_authority_use_system_location = use_system_location;
@@ -484,9 +479,7 @@ from_child_cb (GIOChannel *source, GIOCondition condition, gpointer data)
{
g_free (session->priv->username);
session->priv->username = username;
- if (session->priv->user)
- g_object_unref (session->priv->user);
- session->priv->user = NULL;
+ g_clear_object (&session->priv->user);
}
else
g_free (username);
@@ -920,10 +913,8 @@ session_finalize (GObject *object)
Session *self = SESSION (object);
int i;
- if (self->priv->config)
- g_object_unref (self->priv->config);
- if (self->priv->display_server)
- g_object_unref (self->priv->display_server);
+ g_clear_object (&self->priv->config);
+ g_clear_object (&self->priv->display_server);
if (self->priv->pid)
kill (self->priv->pid, SIGKILL);
close (self->priv->to_child_input);
@@ -935,8 +926,7 @@ session_finalize (GObject *object)
if (self->priv->child_watch)
g_source_remove (self->priv->child_watch);
g_free (self->priv->username);
- if (self->priv->user)
- g_object_unref (self->priv->user);
+ g_clear_object (&self->priv->user);
g_free (self->priv->pam_service);
for (i = 0; i < self->priv->messages_length; i++)
g_free ((char *) self->priv->messages[i].msg);
@@ -945,8 +935,7 @@ session_finalize (GObject *object)
g_free (self->priv->log_filename);
g_free (self->priv->tty);
g_free (self->priv->xdisplay);
- if (self->priv->x_authority)
- g_object_unref (self->priv->x_authority);
+ g_clear_object (&self->priv->x_authority);
g_free (self->priv->remote_host_name);
g_free (self->priv->login1_session_id);
g_free (self->priv->console_kit_cookie);
diff --git a/src/shared-data-manager.c b/src/shared-data-manager.c
index 47f1c10d..fd7427e3 100644
--- a/src/shared-data-manager.c
+++ b/src/shared-data-manager.c
@@ -49,11 +49,7 @@ shared_data_manager_get_instance (void)
void
shared_data_manager_cleanup (void)
{
- if (singleton)
- {
- g_object_unref (singleton);
- singleton = NULL;
- }
+ g_clear_object (&singleton);
}
static void
@@ -245,22 +241,14 @@ shared_data_manager_init (SharedDataManager *manager)
}
static void
-shared_data_manager_dispose (GObject *object)
+shared_data_manager_finalize (GObject *object)
{
SharedDataManager *self = SHARED_DATA_MANAGER (object);
-
+
/* Should also cancel outstanding GIO operations, but whatever, let them do their thing. */
g_signal_handlers_disconnect_by_data (common_user_list_get_instance (), self);
- G_OBJECT_CLASS (shared_data_manager_parent_class)->dispose (object);
-}
-
-static void
-shared_data_manager_finalize (GObject *object)
-{
- SharedDataManager *self = SHARED_DATA_MANAGER (object);
-
if (self->priv->starting_dirs)
g_hash_table_destroy (self->priv->starting_dirs);
@@ -274,7 +262,6 @@ shared_data_manager_class_init (SharedDataManagerClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
- object_class->dispose = shared_data_manager_dispose;
object_class->finalize = shared_data_manager_finalize;
g_type_class_add_private (klass, sizeof (SharedDataManagerPrivate));
diff --git a/src/unity-system-compositor.c b/src/unity-system-compositor.c
index f4b74eb1..0b89d2c2 100644
--- a/src/unity-system-compositor.c
+++ b/src/unity-system-compositor.c
@@ -482,9 +482,7 @@ unity_system_compositor_init (UnitySystemCompositor *compositor)
static void
unity_system_compositor_finalize (GObject *object)
{
- UnitySystemCompositor *self;
-
- self = UNITY_SYSTEM_COMPOSITOR (object);
+ UnitySystemCompositor *self = UNITY_SYSTEM_COMPOSITOR (object);
if (self->priv->process)
{
diff --git a/src/vnc-server.c b/src/vnc-server.c
index d4e6e9d9..914a5ebd 100644
--- a/src/vnc-server.c
+++ b/src/vnc-server.c
@@ -179,15 +179,11 @@ vnc_server_init (VNCServer *server)
static void
vnc_server_finalize (GObject *object)
{
- VNCServer *self;
-
- self = VNC_SERVER (object);
+ VNCServer *self = VNC_SERVER (object);
g_free (self->priv->listen_address);
- if (self->priv->socket)
- g_object_unref (self->priv->socket);
- if (self->priv->socket6)
- g_object_unref (self->priv->socket6);
+ g_clear_object (&self->priv->socket);
+ g_clear_object (&self->priv->socket6);
G_OBJECT_CLASS (vnc_server_parent_class)->finalize (object);
}
diff --git a/src/wayland-session.c b/src/wayland-session.c
index 19a50aa5..639893ea 100644
--- a/src/wayland-session.c
+++ b/src/wayland-session.c
@@ -81,9 +81,7 @@ wayland_session_init (WaylandSession *session)
static void
wayland_session_finalize (GObject *object)
{
- WaylandSession *self;
-
- self = WAYLAND_SESSION (object);
+ WaylandSession *self = WAYLAND_SESSION (object);
if (self->priv->have_vt_ref)
vt_unref (self->priv->vt);
diff --git a/src/x-authority.c b/src/x-authority.c
index 25f66438..6e08d12e 100644
--- a/src/x-authority.c
+++ b/src/x-authority.c
@@ -372,9 +372,7 @@ x_authority_init (XAuthority *auth)
static void
x_authority_finalize (GObject *object)
{
- XAuthority *self;
-
- self = X_AUTHORITY (object);
+ XAuthority *self = X_AUTHORITY (object);
g_free (self->priv->address);
g_free (self->priv->number);
diff --git a/src/x-server-local.c b/src/x-server-local.c
index d9b03982..dcbfbc0a 100644
--- a/src/x-server-local.c
+++ b/src/x-server-local.c
@@ -610,9 +610,7 @@ x_server_local_init (XServerLocal *server)
static void
x_server_local_finalize (GObject *object)
{
- XServerLocal *self;
-
- self = X_SERVER_LOCAL (object);
+ XServerLocal *self = X_SERVER_LOCAL (object);
if (self->priv->x_server_process)
{
diff --git a/src/x-server-xvnc.c b/src/x-server-xvnc.c
index a48290e5..aea28177 100644
--- a/src/x-server-xvnc.c
+++ b/src/x-server-xvnc.c
@@ -158,8 +158,7 @@ stopped_cb (Process *process, XServerXVNC *server)
{
l_debug (server, "Xvnc server stopped");
- g_object_unref (server->priv->x_server_process);
- server->priv->x_server_process = NULL;
+ g_clear_object (&server->priv->x_server_process);
x_server_local_release_display_number (x_server_get_display_number (X_SERVER (server)));
@@ -291,12 +290,9 @@ x_server_xvnc_init (XServerXVNC *server)
static void
x_server_xvnc_finalize (GObject *object)
{
- XServerXVNC *self;
+ XServerXVNC *self = X_SERVER_XVNC (object);
- self = X_SERVER_XVNC (object);
-
- if (self->priv->x_server_process)
- g_object_unref (self->priv->x_server_process);
+ g_clear_object (&self->priv->x_server_process);
g_free (self->priv->command);
g_free (self->priv->authority_file);
diff --git a/src/x-server.c b/src/x-server.c
index 10ba903a..d0260bef 100644
--- a/src/x-server.c
+++ b/src/x-server.c
@@ -90,12 +90,9 @@ x_server_set_authority (XServer *server, XAuthority *authority)
{
g_return_if_fail (server != NULL);
- if (server->priv->authority)
- g_object_unref (server->priv->authority);
+ g_clear_object (&server->priv->authority);
if (authority)
server->priv->authority = g_object_ref (authority);
- else
- server->priv->authority = NULL;
}
XAuthority *
@@ -204,14 +201,11 @@ x_server_init (XServer *server)
static void
x_server_finalize (GObject *object)
{
- XServer *self;
-
- self = X_SERVER (object);
+ XServer *self = X_SERVER (object);
g_free (self->priv->hostname);
g_free (self->priv->address);
- if (self->priv->authority)
- g_object_unref (self->priv->authority);
+ g_clear_object (&self->priv->authority);
if (self->priv->connection)
xcb_disconnect (self->priv->connection);
diff --git a/src/xdmcp-server.c b/src/xdmcp-server.c
index 197dbc11..4761b7b0 100644
--- a/src/xdmcp-server.c
+++ b/src/xdmcp-server.c
@@ -743,14 +743,10 @@ xdmcp_server_init (XDMCPServer *server)
static void
xdmcp_server_finalize (GObject *object)
{
- XDMCPServer *self;
+ XDMCPServer *self = XDMCP_SERVER (object);
- self = XDMCP_SERVER (object);
-
- if (self->priv->socket)
- g_object_unref (self->priv->socket);
- if (self->priv->socket6)
- g_object_unref (self->priv->socket6);
+ g_clear_object (&self->priv->socket);
+ g_clear_object (&self->priv->socket6);
g_free (self->priv->listen_address);
g_free (self->priv->hostname);
g_free (self->priv->status);
diff --git a/src/xdmcp-session.c b/src/xdmcp-session.c
index 71c5704d..bb78ac66 100644
--- a/src/xdmcp-session.c
+++ b/src/xdmcp-session.c
@@ -77,15 +77,11 @@ xdmcp_session_init (XDMCPSession *session)
static void
xdmcp_session_finalize (GObject *object)
{
- XDMCPSession *self;
-
- self = XDMCP_SESSION (object);
+ XDMCPSession *self = XDMCP_SESSION (object);
g_free (self->priv->manufacturer_display_id);
- if (self->priv->address)
- g_object_unref (self->priv->address);
- if (self->priv->authority)
- g_object_unref (self->priv->authority);
+ g_clear_object (&self->priv->address);
+ g_clear_object (&self->priv->authority);
g_free (self->priv->display_class);
G_OBJECT_CLASS (xdmcp_session_parent_class)->finalize (object);
diff --git a/tests/Makefile.am b/tests/Makefile.am
index b4d73c65..a96c77f1 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -134,9 +134,11 @@ TESTS = \
test-dbus \
test-lock-seat \
test-lock-seat-after-vt-switch \
+ test-lock-seat-twice \
test-lock-seat-resettable \
test-lock-seat-return-session \
test-lock-session \
+ test-lock-session-twice \
test-lock-session-no-password \
test-lock-session-resettable \
test-lock-session-return-session \
@@ -434,10 +436,12 @@ EXTRA_DIST = \
scripts/lock-seat-resettable.conf \
scripts/lock-seat-return-session.conf \
scripts/lock-seat-return-session-console-kit.conf \
+ scripts/lock-seat-twice.conf \
scripts/lock-session.conf \
scripts/lock-session-no-password.conf \
scripts/lock-session-resettable.conf \
scripts/lock-session-return-session.conf \
+ scripts/lock-session-twice.conf \
scripts/login.conf \
scripts/login-crash-authenticate.conf \
scripts/login-guest.conf \
diff --git a/tests/scripts/lock-seat-after-vt-switch.conf b/tests/scripts/lock-seat-after-vt-switch.conf
index 4a20ea19..d9cb9ccb 100644
--- a/tests/scripts/lock-seat-after-vt-switch.conf
+++ b/tests/scripts/lock-seat-after-vt-switch.conf
@@ -61,21 +61,19 @@ user-session=default
# Lock the seat again
#?*SESSION-X-0 LOCK-SEAT
#?SESSION-X-0 LOCK-SEAT
-
-# New X server starts (this is a "bug")
-#?XSERVER-2 START VT=9 SEAT=seat0
-#?*XSERVER-2 INDICATE-READY
-#?XSERVER-2 INDICATE-READY
-#?XSERVER-2 ACCEPT-CONNECT
-
-# Session is locked
#?LOGIN1 LOCK-SESSION SESSION=c0
-# Session is switched to greeter
-#?LOGIN1 ACTIVATE-SESSION SESSION=c1
+# Old greeter is stopped
+#?GREETER-X-1 TERMINATE SIGNAL=15
-# The unnecessary X server is killed
-#?XSERVER-2 TERMINATE SIGNAL=15
+# A new greeter is started and activated on the same X server
+#?LOGIN1 ACTIVATE-SESSION SESSION=c2
+#?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter
+#?XSERVER-1 ACCEPT-CONNECT
+#?GREETER-X-1 CONNECT-XSERVER
+#?GREETER-X-1 CONNECT-TO-DAEMON
+#?GREETER-X-1 CONNECTED-TO-DAEMON
+#?GREETER-X-1 LOCK-HINT
# Cleanup
#?*STOP-DAEMON
diff --git a/tests/scripts/lock-seat-twice.conf b/tests/scripts/lock-seat-twice.conf
new file mode 100644
index 00000000..c8d6dc8e
--- /dev/null
+++ b/tests/scripts/lock-seat-twice.conf
@@ -0,0 +1,75 @@
+#
+# Check locking a seat twice doesn't spawn two greeters
+#
+
+[SeatDefaults]
+autologin-user=have-password1
+user-session=default
+
+#?*START-DAEMON
+#?RUNNER DAEMON-START
+
+# X server starts
+#?XSERVER-0 START VT=7 SEAT=seat0
+
+# Daemon connects when X server is ready
+#?*XSERVER-0 INDICATE-READY
+#?XSERVER-0 INDICATE-READY
+#?XSERVER-0 ACCEPT-CONNECT
+
+# Session starts
+#?SESSION-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_GREETER_DATA_DIR=.*/have-password1 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=default USER=have-password1
+#?LOGIN1 ACTIVATE-SESSION SESSION=c0
+#?XSERVER-0 ACCEPT-CONNECT
+#?SESSION-X-0 CONNECT-XSERVER
+
+# Lock the seat
+#?*SESSION-X-0 LOCK-SEAT
+#?SESSION-X-0 LOCK-SEAT
+
+# New X server starts
+#?XSERVER-1 START VT=8 SEAT=seat0
+
+# Daemon connects when X server is ready
+#?*XSERVER-1 INDICATE-READY
+#?XSERVER-1 INDICATE-READY
+#?XSERVER-1 ACCEPT-CONNECT
+
+# Session is locked
+#?LOGIN1 LOCK-SESSION SESSION=c0
+
+# Greeter starts
+#?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter
+#?XSERVER-1 ACCEPT-CONNECT
+#?GREETER-X-1 CONNECT-XSERVER
+#?GREETER-X-1 CONNECT-TO-DAEMON
+#?GREETER-X-1 CONNECTED-TO-DAEMON
+#?GREETER-X-1 LOCK-HINT
+
+# Switch to greeter
+#?LOGIN1 ACTIVATE-SESSION SESSION=c1
+#?VT ACTIVATE VT=8
+
+# Lock the seat again
+#?*SESSION-X-0 LOCK-SEAT
+#?SESSION-X-0 LOCK-SEAT
+
+# Old greeter is stopped
+#?GREETER-X-1 TERMINATE SIGNAL=15
+
+# A new greeter is started and activated on the same X server
+#?LOGIN1 ACTIVATE-SESSION SESSION=c2
+#?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter
+#?XSERVER-1 ACCEPT-CONNECT
+#?GREETER-X-1 CONNECT-XSERVER
+#?GREETER-X-1 CONNECT-TO-DAEMON
+#?GREETER-X-1 CONNECTED-TO-DAEMON
+#?GREETER-X-1 LOCK-HINT
+
+# Cleanup
+#?*STOP-DAEMON
+#?SESSION-X-0 TERMINATE SIGNAL=15
+#?XSERVER-0 TERMINATE SIGNAL=15
+#?GREETER-X-1 TERMINATE SIGNAL=15
+#?XSERVER-1 TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
diff --git a/tests/scripts/lock-session-twice.conf b/tests/scripts/lock-session-twice.conf
new file mode 100644
index 00000000..e7f20c3d
--- /dev/null
+++ b/tests/scripts/lock-session-twice.conf
@@ -0,0 +1,77 @@
+#
+# Check locking a session twice doesn't spawn two greeters
+#
+
+[SeatDefaults]
+autologin-user=have-password1
+user-session=default
+
+#?*START-DAEMON
+#?RUNNER DAEMON-START
+
+# X server starts
+#?XSERVER-0 START VT=7 SEAT=seat0
+
+# Daemon connects when X server is ready
+#?*XSERVER-0 INDICATE-READY
+#?XSERVER-0 INDICATE-READY
+#?XSERVER-0 ACCEPT-CONNECT
+
+# Session starts
+#?SESSION-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_GREETER_DATA_DIR=.*/have-password1 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=default USER=have-password1
+#?LOGIN1 ACTIVATE-SESSION SESSION=c0
+#?XSERVER-0 ACCEPT-CONNECT
+#?SESSION-X-0 CONNECT-XSERVER
+
+# Lock the session
+#?*SESSION-X-0 LOCK-SESSION
+#?SESSION-X-0 LOCK-SESSION
+
+# New X server starts
+#?XSERVER-1 START VT=8 SEAT=seat0
+
+# Daemon connects when X server is ready
+#?*XSERVER-1 INDICATE-READY
+#?XSERVER-1 INDICATE-READY
+#?XSERVER-1 ACCEPT-CONNECT
+
+# Session is locked
+#?LOGIN1 LOCK-SESSION SESSION=c0
+
+# Greeter starts with session user selected
+#?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter
+#?XSERVER-1 ACCEPT-CONNECT
+#?GREETER-X-1 CONNECT-XSERVER
+#?GREETER-X-1 CONNECT-TO-DAEMON
+#?GREETER-X-1 CONNECTED-TO-DAEMON
+#?GREETER-X-1 SELECT-USER-HINT USERNAME=have-password1
+#?GREETER-X-1 LOCK-HINT
+
+# Switch to greeter
+#?LOGIN1 ACTIVATE-SESSION SESSION=c1
+#?VT ACTIVATE VT=8
+
+# Lock the session again
+#?*SESSION-X-0 LOCK-SESSION
+#?SESSION-X-0 LOCK-SESSION
+
+# Old greeter is stopped
+#?GREETER-X-1 TERMINATE SIGNAL=15
+#?LOGIN1 ACTIVATE-SESSION SESSION=c2
+
+# A new greeter is started and activated on the same X server
+#?GREETER-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter
+#?XSERVER-1 ACCEPT-CONNECT
+#?GREETER-X-1 CONNECT-XSERVER
+#?GREETER-X-1 CONNECT-TO-DAEMON
+#?GREETER-X-1 CONNECTED-TO-DAEMON
+#?GREETER-X-1 SELECT-USER-HINT USERNAME=have-password1
+#?GREETER-X-1 LOCK-HINT
+
+# Cleanup
+#?*STOP-DAEMON
+#?SESSION-X-0 TERMINATE SIGNAL=15
+#?XSERVER-0 TERMINATE SIGNAL=15
+#?GREETER-X-1 TERMINATE SIGNAL=15
+#?XSERVER-1 TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
diff --git a/tests/test-lock-seat-twice b/tests/test-lock-seat-twice
new file mode 100755
index 00000000..d39c9855
--- /dev/null
+++ b/tests/test-lock-seat-twice
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner lock-seat-twice test-gobject-greeter
diff --git a/tests/test-lock-session-twice b/tests/test-lock-session-twice
new file mode 100755
index 00000000..61b09d1f
--- /dev/null
+++ b/tests/test-lock-session-twice
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner lock-session-twice test-gobject-greeter