[svn-commits] moy: branch moy/mfcr2-1.4 r235344 - /team/moy/mfcr2-1.4/channels/chan_dahdi.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Wed Dec 16 15:00:36 CST 2009


Author: moy
Date: Wed Dec 16 15:00:35 2009
New Revision: 235344

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=235344
Log:
experimental fix for critical bug in CAS signaling processing

Modified:
    team/moy/mfcr2-1.4/channels/chan_dahdi.c

Modified: team/moy/mfcr2-1.4/channels/chan_dahdi.c
URL: http://svnview.digium.com/svn/asterisk/team/moy/mfcr2-1.4/channels/chan_dahdi.c?view=diff&rev=235344&r1=235343&r2=235344
==============================================================================
--- team/moy/mfcr2-1.4/channels/chan_dahdi.c (original)
+++ team/moy/mfcr2-1.4/channels/chan_dahdi.c Wed Dec 16 15:00:35 2009
@@ -9478,7 +9478,7 @@
 	struct pollfd pollers[sizeof(mfcr2->pvts)];
 	int maxsleep = 20;
 	int res = 0;
-	int i = 0;
+	int i = 0, j = 0;
 	int pollsize = 0;
 	int oldstate = 0;
 	int was_idle = 0;
@@ -9502,8 +9502,6 @@
 		   the module is loaded */
 		pollsize = 0;
 		for (i = 0; i < mfcr2->numchans; i++) {
-			pollers[i].revents = 0;
-			pollers[i].events = 0;
 			if (mfcr2->pvts[i]->owner) {
 				continue;
 			}
@@ -9513,8 +9511,9 @@
 				break;
 			}
 			openr2_chan_enable_read(mfcr2->pvts[i]->r2chan);
-			pollers[i].events = POLLIN | POLLPRI;
-			pollers[i].fd = mfcr2->pvts[i]->subs[SUB_REAL].dfd;
+			pollers[pollsize].events = POLLIN | POLLPRI;
+			pollers[pollsize].revents = 0;
+			pollers[pollsize].fd = mfcr2->pvts[i]->subs[SUB_REAL].dfd;
 			pollsize++;
 		}
 		if (quit_loop) {
@@ -9542,9 +9541,17 @@
 		} 
 		/* do we want to allow to cancel while processing events? */
 		pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
-		for (i = 0; i < mfcr2->numchans; i++) {
-			if (pollers[i].revents & POLLPRI || pollers[i].revents & POLLIN) {
-				openr2_chan_process_event(mfcr2->pvts[i]->r2chan);
+		for (i = 0; i < pollsize; i++) {
+			if (!(pollers[i].revents & POLLPRI) && !(pollers[i].revents & POLLIN)) {
+				continue;
+			}
+			/* search the channel for this fd */
+			for (j = 0; j < mfcr2->numchans; j++) {
+				if (mfcr2->pvts[j]->subs[SUB_REAL].dfd != pollers[i].fd) {
+					continue;
+				}
+				openr2_chan_process_event(mfcr2->pvts[j]->r2chan);
+				break;
 			}
 		}
 		pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate);




More information about the svn-commits mailing list