changeset 705:603b43e4f56a

Fix a bug in iqs_check_timeout() There was a possible segfault because g_slist_next() could be called with a freed element. (Note: this function is never called yet, anyway...) While I'm changing it, I'm changing the prototype so that iqs_check_timeout() takes now_t as a parameter; it will save a time() call.
author Mikael Berthe <mikael@lilotux.net>
date Sat, 18 Feb 2006 15:04:17 +0100
parents 4118a66f2c02
children 934fddc99592
files mcabber/src/jab_iq.c mcabber/src/jab_priv.h
diffstat 2 files changed, 9 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/src/jab_iq.c	Sat Feb 18 12:05:46 2006 +0100
+++ b/mcabber/src/jab_iq.c	Sat Feb 18 15:04:17 2006 +0100
@@ -124,16 +124,18 @@
   return 0;
 }
 
-void iqs_check_timeout(void)
+void iqs_check_timeout(time_t now_t)
 {
   GSList *p;
   iqs *i;
-  time_t now_t;
 
-  time(&now_t);
+  p = iqs_list;
+  while (p) {
+    i = p->data;
+    // We must get next iqs element now because the current one
+    // could be freed.
+    p = g_slist_next(p);
 
-  for (p = iqs_list; p; p = g_slist_next(p)) {
-    i = p->data;
     if ((!i->ts_expire && now_t > i->ts_create + IQS_MAX_TIMEOUT) ||
         (i->ts_expire && now_t > i->ts_expire)) {
       iqs_callback(i->id, NULL, IQS_CONTEXT_TIMEOUT);
--- a/mcabber/src/jab_priv.h	Sat Feb 18 12:05:46 2006 +0100
+++ b/mcabber/src/jab_priv.h	Sat Feb 18 15:04:17 2006 +0100
@@ -20,7 +20,7 @@
 };
 
 
-#define IQS_DEFAULT_TIMEOUT 40
+#define IQS_DEFAULT_TIMEOUT 90
 #define IQS_MAX_TIMEOUT     600
 
 #define IQS_CONTEXT_RESULT  0   /* Normal result should be zero */
@@ -48,7 +48,7 @@
 iqs *iqs_new(guint8 type, const char *ns, const char *prefix, time_t timeout);
 int  iqs_del(const char *iqid);
 int  iqs_callback(const char *iqid, xmlnode xml_result, guint iqcontext);
-void iqs_check_timeout(void);
+void iqs_check_timeout(time_t now_t);
 void iqscallback_auth(iqs *iqp, xmlnode xml_result);
 void request_version(const char *fulljid);
 void request_time(const char *fulljid);