Fix jingle_ack_timeout_checker.
Removing a node in a GSList while iterating over it could produce
unexpected behaviours.
--- 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);
--- 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;
}
--- 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;
}
/**