[svn-commits] rmudgett: trunk r211197 - /trunk/channels/chan_dahdi.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Fri Aug 7 18:30:36 CDT 2009


Author: rmudgett
Date: Fri Aug  7 18:30:32 2009
New Revision: 211197

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=211197
Log:
Fixed some unsafe down cast pointer operations for sig_pri.

You cannot cast the struct dahdi_pvt.sig_pvt pointer to a specific
signaling private pointer without first checking that it is in fact
pointing to the correct signaling private structure.

Modified:
    trunk/channels/chan_dahdi.c

Modified: trunk/channels/chan_dahdi.c
URL: http://svn.asterisk.org/svn-view/asterisk/trunk/channels/chan_dahdi.c?view=diff&rev=211197&r1=211196&r2=211197
==============================================================================
--- trunk/channels/chan_dahdi.c (original)
+++ trunk/channels/chan_dahdi.c Fri Aug  7 18:30:32 2009
@@ -5843,10 +5843,9 @@
 	int priority = 0;
 	struct ast_channel *oc0, *oc1;
 	enum ast_bridge_result res;
-
 #ifdef PRI_2BCT
-	int triedtopribridge = 0;
-	q931_call *q931c0 = NULL, *q931c1 = NULL;
+	q931_call *q931c0;
+	q931_call *q931c1;
 #endif
 
 	/* For now, don't attempt to native bridge if either channel needs DTMF detection.
@@ -6063,13 +6062,28 @@
 		}
 
 #ifdef PRI_2BCT
-		q931c0 = ((struct sig_pri_chan *)(p0->sig_pvt))->call;
-		q931c1 = ((struct sig_pri_chan *)(p1->sig_pvt))->call;
-		if (p0->transfer && p1->transfer
-			&& q931c0 && q931c1
-			&& !triedtopribridge) {
+		switch (p0->sig) {
+		case SIG_PRI:
+		case SIG_BRI:
+		case SIG_BRI_PTMP:
+			q931c0 = ((struct sig_pri_chan *) (p0->sig_pvt))->call;
+			break;
+		default:
+			q931c0 = NULL;
+			break;
+		}
+		switch (p1->sig) {
+		case SIG_PRI:
+		case SIG_BRI:
+		case SIG_BRI_PTMP:
+			q931c1 = ((struct sig_pri_chan *) (p1->sig_pvt))->call;
+			break;
+		default:
+			q931c1 = NULL;
+			break;
+		}
+		if (q931c0 && q931c1 && p0->transfer && p1->transfer) {
 			pri_channel_bridge(q931c0, q931c1);
-			triedtopribridge = 1;
 		}
 #endif
 
@@ -6419,7 +6433,10 @@
 		p->pulsedial = (res & DAHDI_EVENT_PULSEDIGIT) ? 1 : 0;
 		ast_debug(1, "Detected %sdigit '%c'\n", p->pulsedial ? "pulse ": "", res & 0xff);
 #ifdef HAVE_PRI
-		if (!((struct sig_pri_chan *)(p->sig_pvt))->proceeding && ((p->sig == SIG_PRI) || (p->sig == SIG_BRI) || (p->sig == SIG_BRI_PTMP)) && p->pri && (p->pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING)) {
+		if ((p->sig == SIG_PRI || p->sig == SIG_BRI || p->sig == SIG_BRI_PTMP)
+			&& !((struct sig_pri_chan *) p->sig_pvt)->proceeding
+			&& p->pri
+			&& (p->pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING)) {
 			/* absorb event */
 		} else {
 #endif
@@ -7647,9 +7664,11 @@
 				}
 			} else if (f->frametype == AST_FRAME_DTMF) {
 #ifdef HAVE_PRI
-				if (!((struct sig_pri_chan *)(p->sig_pvt))->proceeding && ((p->sig == SIG_PRI) || (p->sig == SIG_BRI) || (p->sig == SIG_BRI_PTMP)) && p->pri &&
-					((!p->outgoing && (p->pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING)) ||
-					(p->outgoing && (p->pri->overlapdial & DAHDI_OVERLAPDIAL_OUTGOING)))) {
+				if ((p->sig == SIG_PRI || p->sig == SIG_BRI || p->sig == SIG_BRI_PTMP)
+					&& !((struct sig_pri_chan *) p->sig_pvt)->proceeding
+					&& p->pri
+					&& ((!p->outgoing && (p->pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING))
+						|| (p->outgoing && (p->pri->overlapdial & DAHDI_OVERLAPDIAL_OUTGOING)))) {
 					/* Don't accept in-band DTMF when in overlap dial mode */
 					f->frametype = AST_FRAME_NULL;
 					f->subclass = 0;
@@ -7739,22 +7758,6 @@
 		return -1;
 	}
 
-#if 0
-#ifdef HAVE_PRI
-	ast_mutex_lock(&p->lock);
-	if (!p->proceeding && p->sig==SIG_PRI && p->pri && !p->outgoing) {
-		if (p->pri->pri) {
-			if (!pri_grab(p, p->pri)) {
-					pri_progress(p->pri->pri,p->call, PVT_TO_CHANNEL(p), !p->digital);
-					pri_rel(p->pri);
-			} else
-					ast_log(LOG_WARNING, "Unable to grab PRI on span %d\n", p->span);
-		}
-		p->proceeding=1;
-	}
-	ast_mutex_unlock(&p->lock);
-#endif
-#endif
 	/* Write a frame of (presumably voice) data */
 	if (frame->frametype != AST_FRAME_VOICE) {
 		if (frame->frametype != AST_FRAME_IMAGE)




More information about the svn-commits mailing list