/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;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.