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