@@ -1380,7 +1380,7 @@ static void op_disconnect_ports(pjmedia_conf *conf,
13801380{
13811381 unsigned src_slot , sink_slot ;
13821382 struct conf_port * src_port = NULL , * dst_port = NULL ;
1383- unsigned i ;
1383+ int i ;
13841384
13851385 /* Ports must be valid. */
13861386 src_slot = prm -> disconnect_ports .src ;
@@ -1440,13 +1440,16 @@ static void op_disconnect_ports(pjmedia_conf *conf,
14401440 dst_port -> name .ptr ));
14411441
14421442 for (i = 0 ; i < conf -> max_ports ; ++ i ) {
1443- unsigned j ;
1443+ int j ;
14441444
14451445 src_port = conf -> ports [i ];
14461446 if (!src_port || src_port -> listener_cnt == 0 )
14471447 continue ;
14481448
1449- for (j = 0 ; j < src_port -> listener_cnt ; ++ j ) {
1449+ /* We need to iterate backwards since the listener count
1450+ * can potentially decrease.
1451+ */
1452+ for (j = src_port -> listener_cnt - 1 ; j >=0 ; -- j ) {
14501453 if (src_port -> listener_slots [j ] == sink_slot ) {
14511454 op_param op_prm = {0 };
14521455 op_prm .disconnect_ports .src = i ;
@@ -1465,7 +1468,10 @@ static void op_disconnect_ports(pjmedia_conf *conf,
14651468 (int )src_port -> name .slen ,
14661469 src_port -> name .ptr ));
14671470
1468- for (i = 0 ; i < src_port -> listener_cnt ; ++ i ) {
1471+ /* We need to iterate backwards since the listener count
1472+ * will keep decreasing.
1473+ */
1474+ for (i = src_port -> listener_cnt - 1 ; i >=0 ; -- i ) {
14691475 op_param op_prm = {0 };
14701476 op_prm .disconnect_ports .src = src_slot ;
14711477 op_prm .disconnect_ports .sink = src_port -> listener_slots [i ];
0 commit comments