Don't call IceCloseConnection() behind libSM's back

The ICE connection is opened by libSM; we can't just close it when
we get an IOError on the ICE connection; instead call SmcCloseConnection()
and mark the connection as closed. This will prevent a segfault if we
exit out of the metacity main loop and get to meta_finalize().

https://bugzilla.gnome.org/show_bug.cgi?id=604867
This commit is contained in:
Owen W. Taylor 2009-12-17 16:20:18 -05:00
parent ba4db78ed9
commit 1d827caaaf

View File

@ -84,6 +84,7 @@ static char* load_state (const char *previous_save_file);
static void regenerate_save_file (void); static void regenerate_save_file (void);
static const char* full_save_file (void); static const char* full_save_file (void);
static void warn_about_lame_clients_and_finish_interact (gboolean shutdown); static void warn_about_lame_clients_and_finish_interact (gboolean shutdown);
static void disconnect (void);
/* This is called when data is available on an ICE connection. */ /* This is called when data is available on an ICE connection. */
static gboolean static gboolean
@ -106,9 +107,12 @@ process_ice_messages (GIOChannel *channel,
IcePointer context = IceGetConnectionContext (connection); IcePointer context = IceGetConnectionContext (connection);
#endif #endif
/* We were disconnected */ /* We were disconnected; close our connection to the
IceSetShutdownNegotiation (connection, False); * session manager, this will result in the ICE connection
IceCloseConnection (connection); * being cleaned up, since it is owned by libSM.
*/
disconnect ();
meta_quit (META_EXIT_SUCCESS);
return FALSE; return FALSE;
} }