[Asterisk-cvs] asterisk/apps app_chanspy.c,1.23,1.24

markster markster
Thu Oct 13 18:15:39 CDT 2005


Update of /usr/cvsroot/asterisk/apps
In directory mongoose.digium.com:/tmp/cvs-serv22461/apps

Modified Files:
	app_chanspy.c 
Log Message:
Fix crash in chanspy (bug #5332)


Index: app_chanspy.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_chanspy.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- app_chanspy.c	14 Sep 2005 20:46:49 -0000	1.23
+++ app_chanspy.c	13 Oct 2005 22:10:16 -0000	1.24
@@ -255,8 +255,9 @@
 	short buf0[1280], buf1[1280], buf[1280];
 		
 	if (csth->spy.status == CHANSPY_DONE) {
+		/* Channel is already gone more than likely */
 		return -1;
-        }
+	}
 
 	ast_mutex_lock(&csth->spy.lock);
 	while((f = csth->spy.queue[0])) {
@@ -326,7 +327,6 @@
 	frame.datalen = x * 2;
 
 	if (ast_write(chan, &frame)) {
-		csth->spy.status = CHANSPY_DONE;
 		return -1;
 	}
 
@@ -373,24 +373,12 @@
 	struct ast_channel_spy *cptr=NULL, *prev=NULL;
 	int count = 0;
 
-	while(ast_mutex_trylock(&chan->lock)) {
-		/* if its locked already it's almost surely hanging up and we are too late 
-		   we can safely remove the head pointer if it points at us without needing a lock.
-		   since everybody spying will be in the same boat whomever is pointing at the head
-		   will surely erase it which is all we really need since it's a linked list of
-		   staticly declared structs that belong to each spy.
-		*/
-		if (chan->spiers == spy) {
-			chan->spiers = NULL;
-			return;
-		}
-		count++;
-		if (count > 10) {
-			return;
-		}
-		sched_yield();
-	}
+	/* If our status has changed, then the channel we're spying on is gone....
+	   DON'T TOUCH IT!!!  RUN AWAY!!! */
+	if (spy->status != CHANSPY_RUNNING)
+		return;
 
+	ast_mutex_lock(&chan->lock);
 	for(cptr=chan->spiers; cptr; cptr=cptr->next) {
 		if (cptr == spy) {
 			if (prev) {




More information about the svn-commits mailing list