From 70f5ad220684e4d3ba1e07d194905f32b0290073 Mon Sep 17 00:00:00 2001 From: Dmitry Podgorny Date: Sat, 12 Jan 2013 21:31:12 +0200 Subject: [PATCH 01/10] jabber.c: use FREE_SET_NULL macro --- src/jabber.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/jabber.c b/src/jabber.c index 8b60a837..42f6a427 100644 --- a/src/jabber.c +++ b/src/jabber.c @@ -106,9 +106,7 @@ jabber_restart(void) { jabber_conn.conn_status = JABBER_STARTED; jabber_conn.presence = PRESENCE_OFFLINE; - if (jabber_conn.status != NULL) - free(jabber_conn.status); - jabber_conn.status = NULL; + FREE_SET_NULL(jabber_conn.status); } jabber_conn_status_t From 83c3fe5b7e90f7cdf5326128fc2151719c01c6d5 Mon Sep 17 00:00:00 2001 From: Dmitry Podgorny Date: Sat, 12 Jan 2013 22:53:07 +0200 Subject: [PATCH 02/10] refactored jabber_connect functions * similar code moved to jabber_connect() * variables saved_* moved to a structure saved_user * 'user' renamed to 'jid' --- src/jabber.c | 110 ++++++++++++++++++--------------------------------- src/jabber.h | 3 +- 2 files changed, 41 insertions(+), 72 deletions(-) diff --git a/src/jabber.c b/src/jabber.c index 42f6a427..485efadf 100644 --- a/src/jabber.c +++ b/src/jabber.c @@ -47,14 +47,18 @@ static struct _jabber_conn_t { int priority; } jabber_conn; -// for auto reconnect -static char *saved_account; -static char *saved_user; -static char *saved_password; -static char *saved_altdomain; -static GTimer *reconnect_timer; static GHashTable *sub_requests; +// for auto reconnect +static struct { + char *account; + char *jid; + char *passwd; + char *altdomain; +} saved_user; + +static GTimer *reconnect_timer; + static log_level_t _get_log_level(xmpp_log_level_t xmpp_level); static xmpp_log_level_t _get_xmpp_log_level(); static void _xmpp_file_logger(void * const userdata, @@ -112,73 +116,37 @@ jabber_restart(void) jabber_conn_status_t jabber_connect_with_account(ProfAccount *account, const char * const passwd) { - saved_account = strdup(account->name); - if (saved_user == NULL) { - saved_user = strdup(account->jid); - } - if (saved_password == NULL) { - saved_password = strdup(passwd); - } - if (saved_altdomain == NULL) { - if (account->server != NULL) { - saved_altdomain = strdup(account->server); - } - } - - log_info("Connecting with account:%s, jid: %s", account->name, account->jid); - xmpp_initialize(); - - jabber_conn.log = _xmpp_get_file_logger(); - jabber_conn.ctx = xmpp_ctx_new(NULL, jabber_conn.log); - jabber_conn.conn = xmpp_conn_new(jabber_conn.ctx); - - xmpp_conn_set_jid(jabber_conn.conn, account->jid); - xmpp_conn_set_pass(jabber_conn.conn, passwd); - - if (jabber_conn.tls_disabled) - xmpp_conn_disable_tls(jabber_conn.conn); - - int connect_status = xmpp_connect_client(jabber_conn.conn, account->server, 0, - _connection_handler, jabber_conn.ctx); - - if (connect_status == 0) - jabber_conn.conn_status = JABBER_CONNECTING; - else - jabber_conn.conn_status = JABBER_DISCONNECTED; - - return jabber_conn.conn_status; + FREE_SET_NULL(saved_user.account); + saved_user.account = strdup(account->name); + log_info("Connecting with account: %s", account->name); + return jabber_connect(account->jid, passwd, account->server); } jabber_conn_status_t -jabber_connect(const char * const user, +jabber_connect(const char * const jid, const char * const passwd, const char * const altdomain) { - if (saved_account != NULL) { - free(saved_account); - saved_account = NULL; - } + FREE_SET_NULL(saved_user.jid); + FREE_SET_NULL(saved_user.passwd); + FREE_SET_NULL(saved_user.altdomain); - if (saved_user == NULL) { - saved_user = strdup(user); - } - if (saved_password == NULL) { - saved_password = strdup(passwd); - } - if (saved_altdomain == NULL) { - if (altdomain != NULL) { - saved_altdomain = strdup(altdomain); - } - } + if (jid == NULL || passwd == NULL) + return JABBER_UNDEFINED; - log_info("Connecting as %s", saved_user); + saved_user.jid = strdup(jid); + saved_user.passwd = strdup(passwd); + if (altdomain != NULL) + saved_user.altdomain = strdup(altdomain); + + log_info("Connecting as %s", jid); xmpp_initialize(); jabber_conn.log = _xmpp_get_file_logger(); jabber_conn.ctx = xmpp_ctx_new(NULL, jabber_conn.log); jabber_conn.conn = xmpp_conn_new(jabber_conn.ctx); - xmpp_conn_set_jid(jabber_conn.conn, saved_user); - xmpp_conn_set_pass(jabber_conn.conn, saved_password); + xmpp_conn_set_jid(jabber_conn.conn, jid); + xmpp_conn_set_pass(jabber_conn.conn, passwd); if (jabber_conn.tls_disabled) xmpp_conn_disable_tls(jabber_conn.conn); @@ -224,8 +192,8 @@ jabber_process_events(void) if ((jabber_conn.conn_status == JABBER_DISCONNECTED) && (reconnect_timer != NULL)) { if (g_timer_elapsed(reconnect_timer, NULL) > prefs_get_reconnect()) { - log_debug("Attempting reconnect as %s", saved_user); - jabber_connect(saved_user, saved_password, saved_altdomain); + log_debug("Attempting reconnect as %s", saved_user.jid); + jabber_connect(saved_user.jid, saved_user.passwd, saved_user.altdomain); } } } @@ -520,10 +488,10 @@ jabber_get_status(void) void jabber_free_resources(void) { - FREE_SET_NULL(saved_user); - FREE_SET_NULL(saved_password); - FREE_SET_NULL(saved_account); - FREE_SET_NULL(saved_altdomain); + FREE_SET_NULL(saved_user.jid); + FREE_SET_NULL(saved_user.passwd); + FREE_SET_NULL(saved_user.account); + FREE_SET_NULL(saved_user.altdomain); chat_sessions_clear(); if (sub_requests != NULL) g_hash_table_remove_all(sub_requests); @@ -752,11 +720,11 @@ _connection_handler(xmpp_conn_t * const conn, // login success if (status == XMPP_CONN_CONNECT) { - if (saved_account != NULL) { - prof_handle_login_account_success(saved_account); + if (saved_user.account != NULL) { + prof_handle_login_account_success(saved_user.account); } else { const char *jid = xmpp_conn_get_jid(conn); - prof_handle_login_success(jid, saved_altdomain); + prof_handle_login_success(jid, saved_user.altdomain); } chat_sessions_init(); @@ -789,7 +757,7 @@ _connection_handler(xmpp_conn_t * const conn, if (prefs_get_reconnect() != 0) { assert(reconnect_timer == NULL); reconnect_timer = g_timer_new(); - // TODO: free resources but leave saved_* untouched + // TODO: free resources but leave saved_user untouched } else { jabber_free_resources(); } @@ -803,7 +771,7 @@ _connection_handler(xmpp_conn_t * const conn, if (prefs_get_reconnect() != 0) { g_timer_start(reconnect_timer); } - // TODO: free resources but leave saved_* untouched + // TODO: free resources but leave saved_user untouched } } diff --git a/src/jabber.h b/src/jabber.h index 9b4453e5..897ca242 100644 --- a/src/jabber.h +++ b/src/jabber.h @@ -26,6 +26,7 @@ #include "accounts.h" typedef enum { + JABBER_UNDEFINED, JABBER_STARTED, JABBER_CONNECTING, JABBER_CONNECTED, @@ -49,7 +50,7 @@ typedef enum { } jabber_subscr_t; void jabber_init(const int disable_tls); -jabber_conn_status_t jabber_connect(const char * const user, +jabber_conn_status_t jabber_connect(const char * const jid, const char * const passwd, const char * const altdomain); jabber_conn_status_t jabber_connect_with_account(ProfAccount *account, const char * const passwd); From db9c9ab091c40bf2249010816cd0831520afc2e0 Mon Sep 17 00:00:00 2001 From: Dmitry Podgorny Date: Sat, 12 Jan 2013 23:23:40 +0200 Subject: [PATCH 03/10] set NULL only when resource != NULL in FREE_SET_NULL --- src/jabber.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/jabber.c b/src/jabber.c index 485efadf..a3db7d85 100644 --- a/src/jabber.c +++ b/src/jabber.c @@ -88,10 +88,11 @@ static int _presence_handler(xmpp_conn_t * const conn, static int _ping_timed_handler(xmpp_conn_t * const conn, void * const userdata); #define FREE_SET_NULL(resource) \ -{\ - if (resource != NULL) \ +{ \ + if (resource != NULL) { \ free(resource); \ - resource = NULL; \ + resource = NULL; \ + } \ } void From 9121cbe29578539f489db3b1642aa366b2cfca14 Mon Sep 17 00:00:00 2001 From: Dmitry Podgorny Date: Sat, 12 Jan 2013 23:32:32 +0200 Subject: [PATCH 04/10] fixed memory leak in jabber_subscription() --- src/jabber.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/jabber.c b/src/jabber.c index a3db7d85..7709c405 100644 --- a/src/jabber.c +++ b/src/jabber.c @@ -295,8 +295,10 @@ jabber_subscription(const char * const jid, jabber_subscr_t action) type = STANZA_TYPE_SUBSCRIBED; else if (action == PRESENCE_UNSUBSCRIBED) type = STANZA_TYPE_UNSUBSCRIBED; - else // unknown action + else { // unknown action + free(jid_cpy); return; + } presence = xmpp_stanza_new(jabber_conn.ctx); xmpp_stanza_set_name(presence, STANZA_NAME_PRESENCE); From 9660f402ad39a525e66fc5d7e203fadd30df28ee Mon Sep 17 00:00:00 2001 From: Dmitry Podgorny Date: Sat, 12 Jan 2013 23:40:21 +0200 Subject: [PATCH 05/10] added JABBER_PRIORITY_* macros --- src/jabber.c | 2 +- src/jabber.h | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/jabber.c b/src/jabber.c index 7709c405..8579cec3 100644 --- a/src/jabber.c +++ b/src/jabber.c @@ -364,7 +364,7 @@ jabber_update_presence(jabber_presence_t status, const char * const msg, return; pri = prefs_get_priority(); - if (pri < -128 || pri > 127) + if (pri < JABBER_PRIORITY_MIN || pri > JABBER_PRIORITY_MAX) pri = 0; jabber_conn.presence = status; diff --git a/src/jabber.h b/src/jabber.h index 897ca242..326328cc 100644 --- a/src/jabber.h +++ b/src/jabber.h @@ -49,6 +49,9 @@ typedef enum { PRESENCE_UNSUBSCRIBED } jabber_subscr_t; +#define JABBER_PRIORITY_MIN -128 +#define JABBER_PRIORITY_MAX 127 + void jabber_init(const int disable_tls); jabber_conn_status_t jabber_connect(const char * const jid, const char * const passwd, const char * const altdomain); From d04c7d070a6a36291b940d40b2bb708e0f73b410 Mon Sep 17 00:00:00 2001 From: Dmitry Podgorny Date: Sat, 12 Jan 2013 23:48:24 +0200 Subject: [PATCH 06/10] refactored jabber_set_autoping() --- src/jabber.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/jabber.c b/src/jabber.c index 8579cec3..52b9ac0d 100644 --- a/src/jabber.c +++ b/src/jabber.c @@ -442,9 +442,7 @@ jabber_update_presence(jabber_presence_t status, const char * const msg, void jabber_set_autoping(int seconds) { - if (jabber_conn.conn_status != JABBER_CONNECTED) { - return; - } else { + if (jabber_conn.conn_status == JABBER_CONNECTED) { xmpp_timed_handler_delete(jabber_conn.conn, _ping_timed_handler); if (seconds != 0) { From 492a333294d75ef60af1ebd16c063b217a0d2180 Mon Sep 17 00:00:00 2001 From: Dmitry Podgorny Date: Sat, 12 Jan 2013 23:52:00 +0200 Subject: [PATCH 07/10] room_jid should be (char *) --- src/jabber.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jabber.c b/src/jabber.c index 52b9ac0d..047c77e3 100644 --- a/src/jabber.c +++ b/src/jabber.c @@ -536,7 +536,7 @@ _groupchat_message_handler(xmpp_stanza_t * const stanza) char *room = NULL; char *nick = NULL; char *message = NULL; - gchar *room_jid = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM); + char *room_jid = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM); // handle room broadcasts if (jid_is_room(room_jid)) { From 59e4db0e961ab6fa4bf1e3af8201b13c54357d8c Mon Sep 17 00:00:00 2001 From: Dmitry Podgorny Date: Sun, 13 Jan 2013 00:06:50 +0200 Subject: [PATCH 08/10] don't release room and nick when parsing failed --- src/jabber.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/jabber.c b/src/jabber.c index 047c77e3..a062ca27 100644 --- a/src/jabber.c +++ b/src/jabber.c @@ -569,9 +569,6 @@ _groupchat_message_handler(xmpp_stanza_t * const stanza) // room jid not of form room/nick if (!parse_room_jid(room_jid, &room, &nick)) { log_error("Could not parse room jid: %s", room_jid); - g_free(room); - g_free(nick); - return 1; } From ef49afdc63256d31319faba33e75fb378daf9da8 Mon Sep 17 00:00:00 2001 From: Dmitry Podgorny Date: Sun, 13 Jan 2013 00:08:31 +0200 Subject: [PATCH 09/10] fixed resources release * Use free instead of g_free as resources are allocated with strdup * Fixed memory leaks --- src/jabber.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/jabber.c b/src/jabber.c index a062ca27..85c06f0d 100644 --- a/src/jabber.c +++ b/src/jabber.c @@ -575,8 +575,8 @@ _groupchat_message_handler(xmpp_stanza_t * const stanza) // room not active in profanity if (!muc_room_is_active(room_jid)) { log_error("Message recieved for inactive groupchat: %s", room_jid); - g_free(room); - g_free(nick); + free(room); + free(nick); return 1; } @@ -596,6 +596,9 @@ _groupchat_message_handler(xmpp_stanza_t * const stanza) } } + free(room); + free(nick); + return 1; } @@ -704,7 +707,7 @@ _chat_message_handler(xmpp_stanza_t * const stanza) } } - g_free(jid); + free(jid); return 1; } @@ -943,9 +946,6 @@ _room_presence_handler(const char * const jid, xmpp_stanza_t * const stanza) if (!parse_room_jid(jid, &room, &nick)) { log_error("Could not parse room jid: %s", room); - g_free(room); - g_free(nick); - return 1; } @@ -1021,6 +1021,9 @@ _room_presence_handler(const char * const jid, xmpp_stanza_t * const stanza) } } + free(room); + free(nick); + return 1; } From 175963eb51bff2262446ea225e3b7879cc0e7cb5 Mon Sep 17 00:00:00 2001 From: Dmitry Podgorny Date: Sun, 13 Jan 2013 00:43:02 +0200 Subject: [PATCH 10/10] check account->name == NULL --- src/jabber.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/jabber.c b/src/jabber.c index 85c06f0d..7645012f 100644 --- a/src/jabber.c +++ b/src/jabber.c @@ -118,6 +118,10 @@ jabber_conn_status_t jabber_connect_with_account(ProfAccount *account, const char * const passwd) { FREE_SET_NULL(saved_user.account); + + if (account->name == NULL) + return JABBER_UNDEFINED; + saved_user.account = strdup(account->name); log_info("Connecting with account: %s", account->name); return jabber_connect(account->jid, passwd, account->server);