[svn-commits] murf: branch murf/bug11210 r102577 - /team/murf/bug11210/channels/chan_sip.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Feb 5 18:45:05 CST 2008


Author: murf
Date: Tue Feb  5 18:45:05 2008
New Revision: 102577

URL: http://svn.digium.com/view/asterisk?view=rev&rev=102577
Log:
Post reviewed and updated code now crashes. (No surprise...) Turned on refcount tracing. Found a few holes, but more remain.

Modified:
    team/murf/bug11210/channels/chan_sip.c

Modified: team/murf/bug11210/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/murf/bug11210/channels/chan_sip.c?view=diff&rev=102577&r1=102576&r2=102577
==============================================================================
--- team/murf/bug11210/channels/chan_sip.c (original)
+++ team/murf/bug11210/channels/chan_sip.c Tue Feb  5 18:45:05 2008
@@ -164,7 +164,7 @@
 #include "asterisk/utils.h"
 #include "asterisk/file.h"
 #include "asterisk/astobj.h"
-/* #define  REF_DEBUG 1 */
+#define  REF_DEBUG 1
 #include "asterisk/astobj2.h"
 #include "asterisk/dnsmgr.h"
 #include "asterisk/devicestate.h"
@@ -2394,6 +2394,8 @@
 {
 	ao2_t_unlink(dialogs, dialog, "unlinking dialog via ao2_unlink");
 
+	dialog_ref(dialog, "Let's bump the count in the unlink so it doesn't accidentally become dead before we are done");
+
 	/* Unlink us from the owner (channel) if we have one */
 	if (dialog->owner) {
 		if (lockowner)
@@ -2408,17 +2410,19 @@
 			dialog->registry->call = dialog_unref(dialog->registry->call, "nulling out the registry's call dialog field in unlink_all");
 		dialog->registry = registry_unref(dialog->registry, "delete dialog->registry");
 	}
-	if (dialog->initid > -1) {
-		if (ast_sched_del(sched, dialog->initid)==0)
-			dialog_unref(dialog, "when you delete the initid sched, you should dec the refcount for the stored dialog ptr");
-		dialog->initid = -1;
-	}
+	if (dialog->stateid > -1) {
+		ast_extension_state_del(dialog->stateid, NULL);
+		dialog_unref(dialog, "removing extension_state, should unref the associated dialog ptr that was stored there.");
+		dialog->stateid = -1; /* shouldn't we 'zero' this out? */
+	}
+
+	AST_SCHED_DEL_UNREF(sched, dialog->waitid, dialog_unref(dialog, "when you delete the waitid sched, you should dec the refcount for the stored dialog ptr"));
+
+	AST_SCHED_DEL_UNREF(sched, dialog->initid, dialog_unref(dialog, "when you delete the initid sched, you should dec the refcount for the stored dialog ptr"));
 	
-	if (dialog->autokillid > -1) {
-		dialog->autokillid = -1;
-		if (ast_sched_del(sched, dialog->autokillid)==0)
-			dialog_unref(dialog, "when you delete the autokillid sched, you should dec the refcount for the stored dialog ptr");
-	}
+	AST_SCHED_DEL_UNREF(sched, dialog->autokillid, dialog_unref(dialog, "when you delete the autokillid sched, you should dec the refcount for the stored dialog ptr"));
+
+	dialog_unref(dialog, "Let's unbump the count in the unlink so the poor pvt can disappear if it is time");
 	return NULL;
 }
 
@@ -4366,12 +4370,6 @@
 	if (p->options)
 		ast_free(p->options);
 
-	if (p->stateid > -1)
-		ast_extension_state_del(p->stateid, NULL);
-	AST_SCHED_DEL_UNREF(sched, p->initid, dialog_unref(p, "when you delete the initid sched, you should dec the refcount for the stored dialog ptr"));
-	AST_SCHED_DEL_UNREF(sched, p->waitid, dialog_unref(p, "when you delete the waitid sched, you should dec the refcount for the stored dialog ptr"));
-	AST_SCHED_DEL_UNREF(sched, p->autokillid, dialog_unref(p, "when you delete the autokillid sched, you should dec the refcount for the stored dialog ptr"));
-
 	if (p->rtp)
 		ast_rtp_destroy(p->rtp);
 	if (p->vrtp)
@@ -4392,6 +4390,7 @@
 		if (p->stimer->st_active == TRUE && p->stimer->st_schedid > -1)
 			ast_sched_del(sched, p->stimer->st_schedid);
 		ast_free(p->stimer);
+		p->stimer = NULL;
 	}
 
 	/* Unlink us from the owner if we have one */
@@ -10436,7 +10435,6 @@
 		if (peer) {
 			ao2_t_link(peers, peer, "link peer into peer table");
 			if (peer->addr.sin_addr.s_addr) {
-				ast_log(LOG_NOTICE, "Inserted %s into peers_by_ip\n", ast_inet_ntoa(peer->addr.sin_addr));
 				ao2_t_link(peers_by_ip, peer, "link peer into peer table");
 			}
 			
@@ -17921,9 +17919,13 @@
 
 	/* Add subscription for extension state from the PBX core */
 	if (p->subscribed != MWI_NOTIFICATION && !resubscribe) {
-		if (p->stateid > -1)
+		if (p->stateid > -1) {
 			ast_extension_state_del(p->stateid, cb_extensionstate);
-		p->stateid = ast_extension_state_add(p->context, p->exten, cb_extensionstate, p);
+			/* we need to dec the refcount, now that the extensionstate is removed */
+			dialog_unref(p, "the extensionstate containing this dialog ptr was deleted");
+		}
+		p->stateid = ast_extension_state_add(p->context, p->exten, cb_extensionstate, p);  /* Here we go -- saving another dialog ptr in an external struct */
+		dialog_ref(p, "stored a dialog ptr in an extensionstate struct");
 	}
 
 	if (!req->ignore && p)
@@ -18755,10 +18757,7 @@
 	}
 
 	if (p->stimer->st_active == TRUE) {
-		if (ast_sched_del(sched, p->stimer->st_schedid) != 0) {
-			ast_log(LOG_WARNING, "ast_sched_del failed: %d - %s\n", p->stimer->st_schedid, p->callid);
-		}
-
+		AST_SCHED_DEL(sched, p->stimer->st_schedid);
 		ast_debug(2, "Session timer stopped: %d - %s\n", p->stimer->st_schedid, p->callid);
 		start_session_timer(p);
 	}
@@ -18775,7 +18774,7 @@
 
 	if (p->stimer->st_active == TRUE) {
 		p->stimer->st_active = FALSE;
-		ast_sched_del(sched, p->stimer->st_schedid);
+		AST_SCHED_DEL(sched, p->stimer->st_schedid);
 		ast_debug(2, "Session timer stopped: %d - %s\n", p->stimer->st_schedid, p->callid);
 	}
 }
@@ -19110,7 +19109,8 @@
 		AST_SCHED_DEL(sched, peer->pokeexpire);
 		
 		peer->lastms = 0;
-		peer->call = NULL;
+		if (peer->call)
+			peer->call = dialog_unref(peer->call, "unref dialog peer->call");
 		return 0;
 	}
 	if (peer->call) {
@@ -21465,7 +21465,6 @@
 						ast_device_state_changed("SIP/%s", peer->name);
 						ao2_t_link(peers, peer, "link peer into peer table");
 						if (peer->addr.sin_addr.s_addr) {
-							ast_log(LOG_NOTICE, "Inserted %s into peers_by_ip\n", ast_inet_ntoa(peer->addr.sin_addr));
 							ao2_t_link(peers_by_ip, peer, "link peer into peers_by_ip table");
 						}
 						
@@ -21539,7 +21538,6 @@
 				if (peer) {
 					ao2_t_link(peers, peer, "link peer into peers table");
 					if (peer->addr.sin_addr.s_addr) {
-						ast_log(LOG_NOTICE, "Inserted %s into peers_by_ip\n", ast_inet_ntoa(peer->addr.sin_addr));
 						ao2_t_link(peers_by_ip, peer, "link peer into peers_by_ip table");
 					}
 					unref_peer(peer, "unref_peer: reload_config: just linked peer to two tables, peers and peers_by_ip");




More information about the svn-commits mailing list