]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Wed Sep 10 09:05:24 EDT 2008 Pekka Pessi <first.last@nokia.com>
authorMichael Jerris <mike@jerris.com>
Wed, 10 Sep 2008 16:20:05 +0000 (16:20 +0000)
committerMichael Jerris <mike@jerris.com>
Wed, 10 Sep 2008 16:20:05 +0000 (16:20 +0000)
  * nua_session.c: fixed client request reference counting in nua_session_usage_remove()

  Bug reported by Della Betta Filippo.

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@9504 d0543943-73ff-0310-b7d9-9358b9ac24b2

libs/sofia-sip/.update
libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c
libs/sofia-sip/libsofia-sip-ua/nua/nua_stack.c

index b81bfa67826d8b4e8a3184829f9ffb9d0619e15d..2517baf3f517d0ab07a18bf0b023f6c906255c37 100644 (file)
@@ -1 +1 @@
-Wed Sep 10 12:19:39 EDT 2008
+Wed Sep 10 12:19:57 EDT 2008
index 564371b735501ee49deaf9c43c38f65877c2b738..78826ac3c7b161cc72e0436293d0cd1b94772776 100644 (file)
@@ -258,11 +258,12 @@ void nua_session_usage_remove(nua_handle_t *nh,
     if (cr == cr0)
       continue;
 
+    nua_client_request_ref(cr);
+
     if (nua_invite_client_should_ack(cr)) {
       ss->ss_reporting = 1;
       nua_invite_client_ack(cr, NULL);
       ss->ss_reporting = 0;
-      nua_client_request_clean(cr);
     }
 
     if (cr == du->du_cr && cr->cr_orq)
@@ -278,6 +279,8 @@ void nua_session_usage_remove(nua_handle_t *nh,
 
     nua_client_request_remove(cr);
 
+    nua_client_request_unref(cr);
+
     cr_next = ds->ds_cr;
   }
 
index 59675129b6757fb40a399909d7208f92588a5313..493f724801e76d8a327d7f2a8c92990041e942bb 100644 (file)
@@ -2154,16 +2154,23 @@ int nua_client_request_queue(nua_client_request_t *cr)
 int
 nua_client_request_remove(nua_client_request_t *cr)
 {
-  if (cr->cr_prev)
+  int retval = 0;
+  int in_queue = cr->cr_prev != NULL;
+
+  if (in_queue) {
     if ((*cr->cr_prev = cr->cr_next))
       cr->cr_next->cr_prev = cr->cr_prev;
+  }
   cr->cr_prev = NULL, cr->cr_next = NULL;
 
   if (cr->cr_timer) {
     su_timer_destroy(cr->cr_timer), cr->cr_timer = NULL;
-    nua_client_request_unref(cr);
+    retval = nua_client_request_unref(cr);
   }
 
+  if (!in_queue)
+    return retval;
+
   return nua_client_request_unref(cr);
 }