[asterisk-commits] russell: trunk r77781 - in /trunk: ./ main/channel.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Jul 30 12:31:30 CDT 2007


Author: russell
Date: Mon Jul 30 12:31:29 2007
New Revision: 77781

URL: http://svn.digium.com/view/asterisk?view=rev&rev=77781
Log:
Merged revisions 77780 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r77780 | russell | 2007-07-30 12:29:43 -0500 (Mon, 30 Jul 2007) | 16 lines

(closes issue #10301)
Reported by: fnordian
Patches:
      asterisk-1.4.9-channel.c.patch uploaded by fnordian (license 110)
      Additional changes by me

Fix some problems in channel_find_locked() which can cause an infinite loop.
The reference to the previous channel is set to NULL in some cases.  These changes
ensure that the reference to the previous channel gets restored before needing
it again.

I'm not convinced that the code that is setting it to NULL is really the right
thing to do.  However, I am making these changes to fix the obvious problem
and just leaving an XXX comment that it needs a better explanation that what
is there now.

........

Modified:
    trunk/   (props changed)
    trunk/main/channel.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.

Modified: trunk/main/channel.c
URL: http://svn.digium.com/view/asterisk/trunk/main/channel.c?view=diff&rev=77781&r1=77780&r2=77781
==============================================================================
--- trunk/main/channel.c (original)
+++ trunk/main/channel.c Mon Jul 30 12:31:29 2007
@@ -931,10 +931,11 @@
 	struct ast_channel *c;
 	const struct ast_channel *_prev = prev;
 
-	for (retries = 0; retries < 10; retries++) {
+	for (retries = 0; retries < 10; retries++, prev = _prev) {
 		int done;
 		AST_RWLIST_RDLOCK(&channels);
 		AST_RWLIST_TRAVERSE(&channels, c, chan_list) {
+			prev = _prev;
 			if (prev) {	/* look for next item */
 				if (c != prev)	/* not this one */
 					continue;
@@ -948,6 +949,7 @@
 				/* We want prev to be NULL in case we end up doing more searching through
 				 * the channel list to find the channel (ie: name searching). If we didn't
 				 * set this to NULL the logic would just blow up
+				 * XXX Need a better explanation for this ...
 				 */
 			}
 			if (name) { /* want match by name */




More information about the asterisk-commits mailing list