Fix jingle_ack_timeout_checker.
authorNicolas Cornu <nicolas.cornu@ensi-bourges.fr>
Mon, 16 Aug 2010 20:11:07 +0200
changeset 135 06b7c6f1c05c
parent 134 8c98308c139d
child 136 405f99d8f3c5
Fix jingle_ack_timeout_checker. Removing a node in a GSList while iterating over it could produce unexpected behaviours.
jingle-filetransfer/filetransfer.c
jingle/jingle.c
jingle/register.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);
--- 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;
 }
 
 /**