Revision ed972b3dfab31a2b23f4b191bfe7d4dcab7cc765

evands at pidgin.im evands at pidgin.im
Sat Mar 31 22:17:20 EDT 2007


o   -----------------------------------------------------------------
|   Revision: ed972b3dfab31a2b23f4b191bfe7d4dcab7cc765
|   Ancestor: a8f93626f382fd856288014fda64487359310c8a
|   Author: evands at pidgin.im
|   Date: 2007-04-01T02:17:06
|   Branch: im.pidgin.pidgin
|   
|   Modified files:
|           libpurple/proxy.c
|   
|   ChangeLog: 
|   
|   I commonly see a crash in which socket_ready_cb(), shortly after a laptop wakes from sleep, is passed invalid (previously freed) connect_data. It looks like this:
|   Thread 0 Crashed:
|   0   libobjc.A.dylib                	0x90a59380 objc_msgSend   16
|   1   Libgaim                        	0x0fe23bcd gaim_proxy_connect_data_disconnect   172
|   2   Libgaim                        	0x0fe23d63 socket_ready_cb   199
|   3   com.apple.CoreFoundation       	0x90843ffd __CFSocketDoCallback   551
|   
|   (objc_msgSend is how ObjC routes messages... it's being called because connect_data->cconnect_cb is invalid).
|   
|   It appears that when this crash happens, the socket is marked as ready just before the computer sleeps; on the next run loop, the callback will be called [socket_ready_cb()].  The computer sleeps and every account is disconnected first, which calls gaim_proxy_connect_cancel_with_handle(), destroying the connect_data.  When it awakens, it calls socket_ready_cb() and the crash occurs.
|   
|   I've added PURPLE_PROXY_CONNECT_DATA_IS_VALID, which takes advantage of the fact that all valid connect_data objects are stored in the handles GSList, just as PURPLE_GAIM_CONNECTION_IS_VALID works.
|   ============================================================
|   --- libpurple/proxy.c	9769957800439d7bc54643d0fc1afe4964a33884
|   +++ libpurple/proxy.c	c5e8a6f8c90f4832272cbf2cc5332581bee040f5
|   @@ -87,6 +87,12 @@ static void try_connect(PurpleProxyConne
|    
|    static void try_connect(PurpleProxyConnectData *connect_data);
|    
|   +/*
|   + * TODO: Eventually (GObjectification) this bad boy will be removed, because it is
|   + *       a gross fix for a crashy problem.
|   + */
|   +#define PURPLE_PROXY_CONNECT_DATA_IS_VALID(connect_data) g_slist_find(handles, connect_data)
|   +
|    /**************************************************************************
|     * Proxy structure API
|     **************************************************************************/
|   @@ -389,6 +395,12 @@ socket_ready_cb(gpointer data, gint sour
|    	int error = 0;
|    	int ret;
|    
|   +	/* If the socket-connected message had already been triggered when connect_data
|   + 	 * was destroyed via purple_proxy_connect_cancel(), we may get here with a freed connect_data.
|   + 	 */
|   +	if (!PURPLE_PROXY_CONNECT_DATA_IS_VALID(connect_data))
|   +		return;
|   +	
|    	purple_debug_info("proxy", "Connected to %s:%d.\n",
|    					connect_data->host, connect_data->port);
|    

To get the patch for this revision, please do this:
mtn log --last 1 --diffs --from ed972b3dfab31a2b23f4b191bfe7d4dcab7cc765


More information about the Commits mailing list