From ebc2eccffb43b2f13433038d5fe23b4672e8a7ab Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Tue, 7 Apr 2009 12:56:02 +0000 Subject: Ticket #781: Fixed conf bridge API functions to have mutex protection when accessing ports. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2582 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/src/pjmedia/conference.c | 101 ++++++++++++++++++++++++++++++--------- 1 file changed, 79 insertions(+), 22 deletions(-) (limited to 'pjmedia/src') diff --git a/pjmedia/src/pjmedia/conference.c b/pjmedia/src/pjmedia/conference.c index c39ec036..e23fab69 100644 --- a/pjmedia/src/pjmedia/conference.c +++ b/pjmedia/src/pjmedia/conference.c @@ -887,8 +887,14 @@ PJ_DEF(pj_status_t) pjmedia_conf_configure_port( pjmedia_conf *conf, /* Check arguments */ PJ_ASSERT_RETURN(conf && slotmax_ports, PJ_EINVAL); + pj_mutex_lock(conf->mutex); + /* Port must be valid. */ - PJ_ASSERT_RETURN(conf->ports[slot] != NULL, PJ_EINVAL); + conf_port = conf->ports[slot]; + if (conf_port == NULL) { + pj_mutex_unlock(conf->mutex); + return PJ_EINVAL; + } conf_port = conf->ports[slot]; @@ -898,6 +904,8 @@ PJ_DEF(pj_status_t) pjmedia_conf_configure_port( pjmedia_conf *conf, if (rx != PJMEDIA_PORT_NO_CHANGE) conf_port->rx_setting = rx; + pj_mutex_unlock(conf->mutex); + return PJ_SUCCESS; } @@ -918,17 +926,18 @@ PJ_DEF(pj_status_t) pjmedia_conf_connect_port( pjmedia_conf *conf, PJ_ASSERT_RETURN(conf && src_slotmax_ports && sink_slotmax_ports, PJ_EINVAL); - /* Ports must be valid. */ - PJ_ASSERT_RETURN(conf->ports[src_slot] != NULL, PJ_EINVAL); - PJ_ASSERT_RETURN(conf->ports[sink_slot] != NULL, PJ_EINVAL); - /* For now, level MUST be zero. */ PJ_ASSERT_RETURN(level == 0, PJ_EINVAL); pj_mutex_lock(conf->mutex); + /* Ports must be valid. */ src_port = conf->ports[src_slot]; dst_port = conf->ports[sink_slot]; + if (!src_port || !dst_port) { + pj_mutex_unlock(conf->mutex); + return PJ_EINVAL; + } /* Check if connection has been made */ for (i=0; ilistener_cnt; ++i) { @@ -980,14 +989,15 @@ PJ_DEF(pj_status_t) pjmedia_conf_disconnect_port( pjmedia_conf *conf, PJ_ASSERT_RETURN(conf && src_slotmax_ports && sink_slotmax_ports, PJ_EINVAL); - /* Ports must be valid. */ - PJ_ASSERT_RETURN(conf->ports[src_slot] != NULL, PJ_EINVAL); - PJ_ASSERT_RETURN(conf->ports[sink_slot] != NULL, PJ_EINVAL); - pj_mutex_lock(conf->mutex); + /* Ports must be valid. */ src_port = conf->ports[src_slot]; dst_port = conf->ports[sink_slot]; + if (!src_port || !dst_port) { + pj_mutex_unlock(conf->mutex); + return PJ_EINVAL; + } /* Check if connection has been made */ for (i=0; ilistener_cnt; ++i) { @@ -1058,9 +1068,6 @@ PJ_DEF(pj_status_t) pjmedia_conf_remove_port( pjmedia_conf *conf, /* Check arguments */ PJ_ASSERT_RETURN(conf && port < conf->max_ports, PJ_EINVAL); - /* Port must be valid. */ - PJ_ASSERT_RETURN(conf->ports[port] != NULL, PJ_EINVAL); - /* Suspend the sound devices. * Don't want to remove port while port is being accessed by sound * device's threads! @@ -1068,7 +1075,13 @@ PJ_DEF(pj_status_t) pjmedia_conf_remove_port( pjmedia_conf *conf, pj_mutex_lock(conf->mutex); + /* Port must be valid. */ conf_port = conf->ports[port]; + if (conf_port == NULL) { + pj_mutex_unlock(conf->mutex); + return PJ_EINVAL; + } + conf_port->tx_setting = PJMEDIA_PORT_DISABLE; conf_port->rx_setting = PJMEDIA_PORT_DISABLE; @@ -1137,6 +1150,9 @@ PJ_DEF(pj_status_t) pjmedia_conf_enum_ports( pjmedia_conf *conf, PJ_ASSERT_RETURN(conf && p_count && ports, PJ_EINVAL); + /* Lock mutex */ + pj_mutex_lock(conf->mutex); + for (i=0; imax_ports && count<*p_count; ++i) { if (!conf->ports[i]) continue; @@ -1144,6 +1160,9 @@ PJ_DEF(pj_status_t) pjmedia_conf_enum_ports( pjmedia_conf *conf, ports[count++] = i; } + /* Unlock mutex */ + pj_mutex_unlock(conf->mutex); + *p_count = count; return PJ_SUCCESS; } @@ -1160,10 +1179,15 @@ PJ_DEF(pj_status_t) pjmedia_conf_get_port_info( pjmedia_conf *conf, /* Check arguments */ PJ_ASSERT_RETURN(conf && slotmax_ports, PJ_EINVAL); - /* Port must be valid. */ - PJ_ASSERT_RETURN(conf->ports[slot] != NULL, PJ_EINVAL); + /* Lock mutex */ + pj_mutex_lock(conf->mutex); + /* Port must be valid. */ conf_port = conf->ports[slot]; + if (conf_port == NULL) { + pj_mutex_unlock(conf->mutex); + return PJ_EINVAL; + } info->slot = slot; info->name = conf_port->name; @@ -1179,6 +1203,9 @@ PJ_DEF(pj_status_t) pjmedia_conf_get_port_info( pjmedia_conf *conf, info->tx_adj_level = conf_port->tx_adj_level - NORMAL_LEVEL; info->rx_adj_level = conf_port->rx_adj_level - NORMAL_LEVEL; + /* Unlock mutex */ + pj_mutex_unlock(conf->mutex); + return PJ_SUCCESS; } @@ -1191,6 +1218,9 @@ PJ_DEF(pj_status_t) pjmedia_conf_get_ports_info(pjmedia_conf *conf, PJ_ASSERT_RETURN(conf && size && info, PJ_EINVAL); + /* Lock mutex */ + pj_mutex_lock(conf->mutex); + for (i=0; imax_ports && count<*size; ++i) { if (!conf->ports[i]) continue; @@ -1199,6 +1229,9 @@ PJ_DEF(pj_status_t) pjmedia_conf_get_ports_info(pjmedia_conf *conf, ++count; } + /* Unlock mutex */ + pj_mutex_unlock(conf->mutex); + *size = count; return PJ_SUCCESS; } @@ -1217,10 +1250,15 @@ PJ_DEF(pj_status_t) pjmedia_conf_get_signal_level( pjmedia_conf *conf, /* Check arguments */ PJ_ASSERT_RETURN(conf && slotmax_ports, PJ_EINVAL); - /* Port must be valid. */ - PJ_ASSERT_RETURN(conf->ports[slot] != NULL, PJ_EINVAL); + /* Lock mutex */ + pj_mutex_lock(conf->mutex); + /* Port must be valid. */ conf_port = conf->ports[slot]; + if (conf_port == NULL) { + pj_mutex_unlock(conf->mutex); + return PJ_EINVAL; + } if (tx_level != NULL) { *tx_level = conf_port->tx_level; @@ -1229,6 +1267,9 @@ PJ_DEF(pj_status_t) pjmedia_conf_get_signal_level( pjmedia_conf *conf, if (rx_level != NULL) *rx_level = conf_port->rx_level; + /* Unlock mutex */ + pj_mutex_unlock(conf->mutex); + return PJ_SUCCESS; } @@ -1245,20 +1286,28 @@ PJ_DEF(pj_status_t) pjmedia_conf_adjust_rx_level( pjmedia_conf *conf, /* Check arguments */ PJ_ASSERT_RETURN(conf && slotmax_ports, PJ_EINVAL); - /* Port must be valid. */ - PJ_ASSERT_RETURN(conf->ports[slot] != NULL, PJ_EINVAL); - /* Value must be from -128 to +127 */ /* Disabled, you can put more than +127, at your own risk: PJ_ASSERT_RETURN(adj_level >= -128 && adj_level <= 127, PJ_EINVAL); */ PJ_ASSERT_RETURN(adj_level >= -128, PJ_EINVAL); + /* Lock mutex */ + pj_mutex_lock(conf->mutex); + + /* Port must be valid. */ conf_port = conf->ports[slot]; + if (conf_port == NULL) { + pj_mutex_unlock(conf->mutex); + return PJ_EINVAL; + } /* Set normalized adjustment level. */ conf_port->rx_adj_level = adj_level + NORMAL_LEVEL; + /* Unlock mutex */ + pj_mutex_unlock(conf->mutex); + return PJ_SUCCESS; } @@ -1275,20 +1324,28 @@ PJ_DEF(pj_status_t) pjmedia_conf_adjust_tx_level( pjmedia_conf *conf, /* Check arguments */ PJ_ASSERT_RETURN(conf && slotmax_ports, PJ_EINVAL); - /* Port must be valid. */ - PJ_ASSERT_RETURN(conf->ports[slot] != NULL, PJ_EINVAL); - /* Value must be from -128 to +127 */ /* Disabled, you can put more than +127,, at your own risk: PJ_ASSERT_RETURN(adj_level >= -128 && adj_level <= 127, PJ_EINVAL); */ PJ_ASSERT_RETURN(adj_level >= -128, PJ_EINVAL); + /* Lock mutex */ + pj_mutex_lock(conf->mutex); + + /* Port must be valid. */ conf_port = conf->ports[slot]; + if (conf_port == NULL) { + pj_mutex_unlock(conf->mutex); + return PJ_EINVAL; + } /* Set normalized adjustment level. */ conf_port->tx_adj_level = adj_level + NORMAL_LEVEL; + /* Unlock mutex */ + pj_mutex_unlock(conf->mutex); + return PJ_SUCCESS; } -- cgit v1.2.3