[svn-commits] jrose: trunk r391430 - /trunk/bridges/bridge_native_rtp.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Jun 11 14:44:49 CDT 2013


Author: jrose
Date: Tue Jun 11 14:44:47 2013
New Revision: 391430

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=391430
Log:
bridge_native_rtp: Fix possible segfaults on leaves/joins

native_rtp_bridge_get can return any result from the ast_rtp_glue_result
enumerator and the join/leave functions for bridge_native_rtp seem to assume
that if the result wasn't local that it was remote. Meanwhile forbid can be
returned by that function which can mean certain glue pointers are NULL. Then
when the join/leave functions try to use members of that pointer, boom.
Segfault.

Modified:
    trunk/bridges/bridge_native_rtp.c

Modified: trunk/bridges/bridge_native_rtp.c
URL: http://svnview.digium.com/svn/asterisk/trunk/bridges/bridge_native_rtp.c?view=diff&rev=391430&r1=391429&r2=391430
==============================================================================
--- trunk/bridges/bridge_native_rtp.c (original)
+++ trunk/bridges/bridge_native_rtp.c Tue Jun 11 14:44:47 2013
@@ -317,7 +317,8 @@
 		glue1->get_codec(c1->chan, cap1);
 	}
 
-	if (native_type == AST_RTP_GLUE_RESULT_LOCAL) {
+	switch (native_type) {
+	case AST_RTP_GLUE_RESULT_LOCAL:
 		if (ast_rtp_instance_get_engine(instance0)->local_bridge) {
 			ast_rtp_instance_get_engine(instance0)->local_bridge(instance0, instance1);
 		}
@@ -326,9 +327,14 @@
 		}
 		ast_rtp_instance_set_bridged(instance0, instance1);
 		ast_rtp_instance_set_bridged(instance1, instance0);
-	} else {
+		break;
+
+	case AST_RTP_GLUE_RESULT_REMOTE:
 		glue0->update_peer(c0->chan, instance1, vinstance1, tinstance1, cap1, 0);
 		glue1->update_peer(c1->chan, instance0, vinstance0, tinstance0, cap0, 0);
+		break;
+	case AST_RTP_GLUE_RESULT_FORBID:
+		break;
 	}
 
 	return 0;
@@ -354,7 +360,8 @@
 
 	native_type = native_rtp_bridge_get(c0->chan, c1 ? c1->chan : NULL, &glue0, &glue1, &instance0, &instance1, &vinstance0, &vinstance1);
 
-	if (native_type == AST_RTP_GLUE_RESULT_LOCAL) {
+	switch (native_type) {
+	case AST_RTP_GLUE_RESULT_LOCAL:
 		if (ast_rtp_instance_get_engine(instance0)->local_bridge) {
 			ast_rtp_instance_get_engine(instance0)->local_bridge(instance0, NULL);
 		}
@@ -365,11 +372,15 @@
 		if (instance1) {
 			ast_rtp_instance_set_bridged(instance1, instance0);
 		}
-	} else {
+		break;
+	case AST_RTP_GLUE_RESULT_REMOTE:
 		glue0->update_peer(c0->chan, NULL, NULL, NULL, NULL, 0);
 		if (glue1) {
 			glue1->update_peer(c1->chan, NULL, NULL, NULL, NULL, 0);
 		}
+		break;
+	case AST_RTP_GLUE_RESULT_FORBID:
+		break;
 	}
 }
 




More information about the svn-commits mailing list