/pidgin/main: e9b9320a985a: Drop PURPLE_CONNECTION_IS_VALID in f...
Tomasz Wasilczyk <[email protected]>
| Newsgroups | gmane.comp.gnome.gaim.cvs |
|---|---|
| Message-ID | <[email protected]> |
Changeset: e9b9320a985ac341c11227a0c265d2e7d361e108 Author: Tomasz Wasilczyk <[email protected]> Date: 2014-05-20 12:46 +0200 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/e9b9320a985a Description: Drop PURPLE_CONNECTION_IS_VALID in favor of (temporary) PURPLE_ASSERT_CONNECTION_IS_VALID diffstat: libpurple/connection.c | 13 ++++++++ libpurple/connection.h | 18 ------------ libpurple/dbus-define-api.h | 2 - libpurple/internal.h | 9 ++++++ libpurple/protocols/bonjour/jabber.c | 9 +++-- libpurple/protocols/gg/avatar.c | 13 ++------ libpurple/protocols/gg/edisc.c | 2 +- libpurple/protocols/gg/gg.c | 2 +- libpurple/protocols/gg/oauth/oauth-purple.c | 12 ++----- libpurple/protocols/gg/pubdir-prpl.c | 12 ++++++-- libpurple/protocols/gg/roster.c | 2 +- libpurple/protocols/gg/tcpsocket.c | 3 ++ libpurple/protocols/jabber/auth.c | 10 ++---- libpurple/protocols/jabber/auth_cyrus.c | 10 ++---- libpurple/protocols/jabber/jabber.c | 19 +++--------- libpurple/protocols/jabber/presence.c | 18 ++++++++---- libpurple/protocols/msn/userlist.c | 42 +++++++++++++++------------- libpurple/protocols/mxit/actions.c | 10 +----- libpurple/protocols/mxit/login.c | 5 +-- libpurple/protocols/silc/silc.c | 12 ++++---- libpurple/protocols/yahoo/libymsg.c | 2 +- 21 files changed, 108 insertions(+), 117 deletions(-) diffs (truncated from 568 to 300 lines): diff --git a/libpurple/connection.c b/libpurple/connection.c --- a/libpurple/connection.c +++ b/libpurple/connection.c @@ -1037,6 +1037,19 @@ void /************************************************************************** * Connections API **************************************************************************/ + +void +_purple_assert_connection_is_valid(PurpleConnection *gc, + const gchar *file, int line) +{ + if (gc && g_list_find(purple_connections_get_all(), gc)) + return; + + purple_debug_fatal("connection", "PURPLE_ASSERT_CONNECTION_IS_VALID(%p)" + " failed at %s:%d", gc, file, line); + exit(-1); +} + void purple_connections_disconnect_all(void) { diff --git a/libpurple/connection.h b/libpurple/connection.h --- a/libpurple/connection.h +++ b/libpurple/connection.h @@ -566,24 +566,6 @@ GList *purple_connections_get_all(void); */ GList *purple_connections_get_connecting(void); -/** - * PURPLE_CONNECTION_IS_VALID: - * @gc: The connection to check - * - * Checks if @gc is still a valid pointer to a connection. - * - * This is deprecated -- do not use this. Instead, cancel your asynchronous - * request when the #PurpleConnection is destroyed. - * - * Returns: %TRUE if @gc is valid. - */ -/* - * TODO: Eventually this bad boy will be removed, because it is - * a gross fix for a crashy problem. - */ -#define PURPLE_CONNECTION_IS_VALID(gc) \ - (g_list_find(purple_connections_get_all(), (gc)) != NULL) - /**************************************************************************/ /* UI Registration Functions */ /**************************************************************************/ diff --git a/libpurple/dbus-define-api.h b/libpurple/dbus-define-api.h --- a/libpurple/dbus-define-api.h +++ b/libpurple/dbus-define-api.h @@ -10,5 +10,3 @@ gboolean PURPLE_BUDDY_IS_ONLINE(PurpleBu /* connection.h */ gboolean PURPLE_CONNECTION_IS_CONNECTED(PurpleConnection *connection); -gboolean PURPLE_CONNECTION_IS_VALID(PurpleConnection *connection); - diff --git a/libpurple/internal.h b/libpurple/internal.h --- a/libpurple/internal.h +++ b/libpurple/internal.h @@ -149,6 +149,11 @@ [(condition) ? 1 : -1]; static_assertion_failed_ ## message dummy; \ (void)dummy; } +/* This is meant to track use-after-free errors. + * TODO: it should be disabled in released code. */ +#define PURPLE_ASSERT_CONNECTION_IS_VALID(gc) \ + _purple_assert_connection_is_valid(gc, __FILE__, __LINE__) + #ifdef __clang__ #define PURPLE_BEGIN_IGNORE_CAST_ALIGN \ @@ -390,4 +395,8 @@ void void _purple_socket_uninit(void); +void +_purple_assert_connection_is_valid(PurpleConnection *gc, + const gchar *file, int line); + #endif /* _PURPLE_INTERNAL_H_ */ diff --git a/libpurple/protocols/bonjour/jabber.c b/libpurple/protocols/bonjour/jabber.c --- a/libpurple/protocols/bonjour/jabber.c +++ b/libpurple/protocols/bonjour/jabber.c @@ -1149,10 +1149,11 @@ bonjour_jabber_close_conversation(Bonjou BonjourData *bd = NULL; PurpleConnection *pc = purple_account_get_connection(bconv->account); - if (PURPLE_CONNECTION_IS_VALID(pc)) { - bd = purple_connection_get_protocol_data(pc); - bd->jabber_data->pending_conversations = g_slist_remove(bd->jabber_data->pending_conversations, bconv); - } + + PURPLE_ASSERT_CONNECTION_IS_VALID(pc); + + bd = purple_connection_get_protocol_data(pc); + bd->jabber_data->pending_conversations = g_slist_remove(bd->jabber_data->pending_conversations, bconv); /* Cancel any file transfers that are waiting to begin */ /* There wont be any transfers if it hasn't been attached to a buddy */ diff --git a/libpurple/protocols/gg/avatar.c b/libpurple/protocols/gg/avatar.c --- a/libpurple/protocols/gg/avatar.c +++ b/libpurple/protocols/gg/avatar.c @@ -126,7 +126,7 @@ static gboolean ggp_avatar_timer_cb(gpoi PurpleConnection *gc = _gc; ggp_avatar_session_data *avdata; - g_return_val_if_fail(PURPLE_CONNECTION_IS_VALID(gc), FALSE); + PURPLE_ASSERT_CONNECTION_IS_VALID(gc); avdata = ggp_avatar_get_avdata(gc); if (avdata->current_update != NULL) { @@ -265,10 +265,7 @@ static void ggp_avatar_buddy_update_rece const gchar *got_data; size_t got_len; - if (!PURPLE_CONNECTION_IS_VALID(gc)) { - g_free(pending_update); - return; - } + PURPLE_ASSERT_CONNECTION_IS_VALID(gc); avdata = ggp_avatar_get_avdata(gc); g_assert(pending_update == avdata->current_update); @@ -321,8 +318,7 @@ void ggp_avatar_own_set(PurpleConnection { ggp_avatar_own_data *own_data; - if (!PURPLE_CONNECTION_IS_VALID(gc) || !PURPLE_CONNECTION_IS_CONNECTED(gc)) - return; + PURPLE_ASSERT_CONNECTION_IS_VALID(gc); purple_debug_info("gg", "ggp_avatar_own_set(%p, %p)", gc, img); @@ -387,8 +383,7 @@ static void ggp_avatar_own_sent(PurpleHt PurpleConnection *gc = purple_http_conn_get_purple_connection(http_conn); - if (!PURPLE_CONNECTION_IS_VALID(gc)) - return; + PURPLE_ASSERT_CONNECTION_IS_VALID(gc); if (!purple_http_response_is_successful(response)) { purple_debug_error("gg", "ggp_avatar_own_sent: " diff --git a/libpurple/protocols/gg/edisc.c b/libpurple/protocols/gg/edisc.c --- a/libpurple/protocols/gg/edisc.c +++ b/libpurple/protocols/gg/edisc.c @@ -128,7 +128,7 @@ ggp_edisc_get_sdata(PurpleConnection *gc { GGPInfo *accdata; - g_return_val_if_fail(PURPLE_CONNECTION_IS_VALID(gc), NULL); + PURPLE_ASSERT_CONNECTION_IS_VALID(gc); accdata = purple_connection_get_protocol_data(gc); g_return_val_if_fail(accdata != NULL, NULL); diff --git a/libpurple/protocols/gg/gg.c b/libpurple/protocols/gg/gg.c --- a/libpurple/protocols/gg/gg.c +++ b/libpurple/protocols/gg/gg.c @@ -420,7 +420,7 @@ void ggp_async_login_handler(gpointer _g GGPInfo *info; struct gg_event *ev; - g_return_if_fail(PURPLE_CONNECTION_IS_VALID(gc)); + PURPLE_ASSERT_CONNECTION_IS_VALID(gc); info = purple_connection_get_protocol_data(gc); diff --git a/libpurple/protocols/gg/oauth/oauth-purple.c b/libpurple/protocols/gg/oauth/oauth-purple.c --- a/libpurple/protocols/gg/oauth/oauth-purple.c +++ b/libpurple/protocols/gg/oauth/oauth-purple.c @@ -115,10 +115,8 @@ static void ggp_oauth_request_token_got( gboolean succ = TRUE; const gchar *xml_raw; - if (!PURPLE_CONNECTION_IS_VALID(data->gc)) { - ggp_oauth_data_free(data); - return; - } + PURPLE_ASSERT_CONNECTION_IS_VALID(data->gc); + account = purple_connection_get_account(data->gc); if (!purple_http_response_is_successful(response)) { @@ -181,10 +179,8 @@ static void ggp_oauth_authorization_done const char *url = "http://api.gadu-gadu.pl/access_token"; int response_code; - if (!PURPLE_CONNECTION_IS_VALID(data->gc)) { - ggp_oauth_data_free(data); - return; - } + PURPLE_ASSERT_CONNECTION_IS_VALID(data->gc); + account = purple_connection_get_account(data->gc); response_code = purple_http_response_get_code(response); diff --git a/libpurple/protocols/gg/pubdir-prpl.c b/libpurple/protocols/gg/pubdir-prpl.c --- a/libpurple/protocols/gg/pubdir-prpl.c +++ b/libpurple/protocols/gg/pubdir-prpl.c @@ -199,7 +199,9 @@ static void ggp_pubdir_get_info_got_toke PurpleHttpRequest *req; ggp_pubdir_request *request = _request; - if (!token || !PURPLE_CONNECTION_IS_VALID(gc)) { + PURPLE_ASSERT_CONNECTION_IS_VALID(gc); + + if (!token) { request->cb(gc, -1, NULL, 0, request->user_data); ggp_pubdir_request_free(request); return; @@ -627,7 +629,9 @@ static void ggp_pubdir_search_got_token( ggp_pubdir_request *request = _request; gchar *query; - if (!token || !PURPLE_CONNECTION_IS_VALID(gc)) { + PURPLE_ASSERT_CONNECTION_IS_VALID(gc); + + if (!token) { request->cb(gc, -1, NULL, 0, request->user_data); ggp_pubdir_request_free(request); return; @@ -899,7 +903,9 @@ static void ggp_pubdir_set_info_got_toke gchar *name, *surname, *city; uin_t uin = record->uin; - if (!token || !PURPLE_CONNECTION_IS_VALID(gc)) { + PURPLE_ASSERT_CONNECTION_IS_VALID(gc); + + if (!token) { /* TODO: notify about failure */ ggp_pubdir_record_free(record, 1); return; diff --git a/libpurple/protocols/gg/roster.c b/libpurple/protocols/gg/roster.c --- a/libpurple/protocols/gg/roster.c +++ b/libpurple/protocols/gg/roster.c @@ -188,7 +188,7 @@ static gboolean ggp_roster_timer_cb(gpoi { PurpleConnection *gc = _gc; - g_return_val_if_fail(PURPLE_CONNECTION_IS_VALID(gc), FALSE); + PURPLE_ASSERT_CONNECTION_IS_VALID(gc); ggp_roster_send_update(gc); diff --git a/libpurple/protocols/gg/tcpsocket.c b/libpurple/protocols/gg/tcpsocket.c --- a/libpurple/protocols/gg/tcpsocket.c +++ b/libpurple/protocols/gg/tcpsocket.c @@ -41,6 +41,8 @@ ggp_tcpsocket_connected(PurpleSocket *ps GGPInfo *info = purple_connection_get_protocol_data(gc); int fd = -1; + PURPLE_ASSERT_CONNECTION_IS_VALID(gc); + if (error == NULL) fd = purple_socket_get_fd(ps); @@ -65,6 +67,7 @@ ggp_tcpsocket_connect(void *_gc, const c PurpleConnection *gc = _gc; PurpleSocket *ps; + PURPLE_ASSERT_CONNECTION_IS_VALID(gc); g_return_val_if_fail(!purple_connection_is_disconnecting(gc), NULL); g_return_val_if_fail(host != NULL, NULL); diff --git a/libpurple/protocols/jabber/auth.c b/libpurple/protocols/jabber/auth.c --- a/libpurple/protocols/jabber/auth.c +++ b/libpurple/protocols/jabber/auth.c @@ -93,9 +93,8 @@ auth_old_pass_cb(PurpleConnection *gc, P const char *entry; gboolean remember; - /* The password prompt dialog doesn't get disposed if the account disconnects */ - if (!PURPLE_CONNECTION_IS_VALID(gc)) - return; + /* TODO: the password prompt dialog doesn't get disposed if the account disconnects */ + PURPLE_ASSERT_CONNECTION_IS_VALID(gc); account = purple_connection_get_account(gc); js = purple_connection_get_protocol_data(gc); @@ -123,9 +122,8 @@ auth_old_pass_cb(PurpleConnection *gc, P static void auth_no_pass_cb(PurpleConnection *gc, PurpleRequestFields *fields) { - /* The password prompt dialog doesn't get disposed if the account disconnects */ - if (!PURPLE_CONNECTION_IS_VALID(gc)) - return; + /* TODO: the password prompt dialog doesn't get disposed if the account disconnects */ + PURPLE_ASSERT_CONNECTION_IS_VALID(gc); /* Disable the account as the user has cancelled connecting */ purple_account_set_enabled(purple_connection_get_account(gc), purple_core_get_ui(), FALSE); diff --git a/libpurple/protocols/jabber/auth_cyrus.c b/libpurple/protocols/jabber/auth_cyrus.c --- a/libpurple/protocols/jabber/auth_cyrus.c +++ b/libpurple/protocols/jabber/auth_cyrus.c @@ -133,9 +133,8 @@ static void auth_pass_cb(PurpleConnectio const char *entry;