# HG changeset patch # User Nicolas Cornu # Date 1281982267 -7200 # Node ID 06b7c6f1c05c8896b6f27a1d58d9dcf794847c27 # Parent 8c98308c139dcdc143e553043120a37ffd44fb4c Fix jingle_ack_timeout_checker. Removing a node in a GSList while iterating over it could produce unexpected behaviours. diff -r 8c98308c139d -r 06b7c6f1c05c jingle-filetransfer/filetransfer.c --- a/jingle-filetransfer/filetransfer.c Mon Aug 16 19:31:50 2010 +0200 +++ b/jingle-filetransfer/filetransfer.c Mon Aug 16 20:11:07 2010 +0200 @@ -421,7 +421,7 @@ el2 = el; el = el->next; } - scr_LogPrint(LPRINT_LOGNORM, "JFT: %i files removed", count); + scr_LogPrint(LPRINT_LOGNORM, "JFT: %i file%s removed", count, (count>1) ? "s" : ""); } else { scr_LogPrint(LPRINT_LOGNORM, "/jft: %s is not a correct option.", args[1]); } @@ -568,6 +568,7 @@ scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: transfer finish (%s)", jft->name); jft->hash = g_strdup(g_checksum_get_string(jft->md5)); + jft->state = JINGLE_FT_ENDING; // Call a function to say state is ended session_changestate_sessioncontent(sess, sc2->name, JINGLE_SESSION_STATE_ENDED); diff -r 8c98308c139d -r 06b7c6f1c05c jingle/jingle.c --- a/jingle/jingle.c Mon Aug 16 19:31:50 2010 +0200 +++ b/jingle/jingle.c Mon Aug 16 20:11:07 2010 +0200 @@ -159,21 +159,27 @@ gboolean jingle_ack_timeout_checker(gpointer user_data) { - GSList *el; + GSList *el, *prev; time_t now = time(NULL); JingleAckHandle *ah; - for (el = ack_handlers; el; el = g_slist_next(el)) { - JingleAckHandle *ah = el->data; + el = ack_handlers; + while(el) { + JingleAckHandle *ah = el->data; - if (ah->timeout == 0 || ah->_inserted + ah->timeout > now) - continue; + if (ah->timeout != 0 && ah->_inserted + ah->timeout <= now) { + if (ah->callback != NULL) { + ah->callback(JINGLE_ACK_TIMEOUT, NULL, ah->user_data); + } - if(ah->callback != NULL) - ah->callback(JINGLE_ACK_TIMEOUT, NULL, ah->user_data); + jingle_ack_handler_free(ah); + if (ack_handlers == NULL) + break; - lm_message_handler_unref(ah->_handler); - jingle_ack_handler_free(ah); + el = prev; + } + prev = el; + el = el->next; } return TRUE; } diff -r 8c98308c139d -r 06b7c6f1c05c jingle/register.c --- a/jingle/register.c Mon Aug 16 19:31:50 2010 +0200 +++ b/jingle/register.c Mon Aug 16 20:11:07 2010 +0200 @@ -117,7 +117,7 @@ JingleTransportPriority bestprio = JINGLE_TRANSPORT_NONE; JingleTransportType requestedtype; - if (entry == NULL) + if (app == NULL) return NULL; requestedtype = app->transtype; @@ -139,7 +139,7 @@ if (forbid != NULL) *forbid = g_slist_append(*forbid, besttransport->xmlns); - return besttransport != NULL?besttransport->xmlns:NULL; + return besttransport != NULL ? besttransport->xmlns : NULL; } /**