mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-02-13 13:40:44 +00:00
Freetdm:fix for ftdm_channel_close not always passed double-pointer
This commit is contained in:
parent
102640ad7b
commit
ea2b477444
@ -2430,14 +2430,9 @@ FT_DECLARE(ftdm_status_t) _ftdm_channel_call_send_msg(const char *file, const ch
|
|||||||
FT_DECLARE(ftdm_status_t) _ftdm_channel_reset(const char *file, const char *func, int line, ftdm_channel_t *ftdmchan)
|
FT_DECLARE(ftdm_status_t) _ftdm_channel_reset(const char *file, const char *func, int line, ftdm_channel_t *ftdmchan)
|
||||||
{
|
{
|
||||||
ftdm_assert_return(ftdmchan != NULL, FTDM_FAIL, "null channel");
|
ftdm_assert_return(ftdmchan != NULL, FTDM_FAIL, "null channel");
|
||||||
#ifdef __WINDOWS__
|
|
||||||
UNREFERENCED_PARAMETER(file);
|
|
||||||
UNREFERENCED_PARAMETER(func);
|
|
||||||
UNREFERENCED_PARAMETER(line);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ftdm_channel_lock(ftdmchan);
|
ftdm_channel_lock(ftdmchan);
|
||||||
ftdm_channel_set_state(file, func, line, ftdmchan, FTDM_CHANNEL_STATE_RESET, 0);
|
ftdm_channel_set_state(file, func, line, ftdmchan, FTDM_CHANNEL_STATE_RESET, 1);
|
||||||
ftdm_channel_unlock(ftdmchan);
|
ftdm_channel_unlock(ftdmchan);
|
||||||
return FTDM_SUCCESS;
|
return FTDM_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -2579,7 +2574,6 @@ static ftdm_status_t ftdm_channel_done(ftdm_channel_t *ftdmchan)
|
|||||||
ftdmchan->txdrops, ftdmchan->rxdrops);
|
ftdmchan->txdrops, ftdmchan->rxdrops);
|
||||||
}
|
}
|
||||||
|
|
||||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "channel done\n");
|
|
||||||
memset(&ftdmchan->caller_data, 0, sizeof(ftdmchan->caller_data));
|
memset(&ftdmchan->caller_data, 0, sizeof(ftdmchan->caller_data));
|
||||||
|
|
||||||
ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_HOLD);
|
ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_HOLD);
|
||||||
@ -2612,6 +2606,7 @@ static ftdm_status_t ftdm_channel_done(ftdm_channel_t *ftdmchan)
|
|||||||
ftdmchan->packet_len = ftdmchan->native_interval * (ftdmchan->effective_codec == FTDM_CODEC_SLIN ? 16 : 8);
|
ftdmchan->packet_len = ftdmchan->native_interval * (ftdmchan->effective_codec == FTDM_CODEC_SLIN ? 16 : 8);
|
||||||
ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_TRANSCODE);
|
ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_TRANSCODE);
|
||||||
}
|
}
|
||||||
|
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "channel done\n");
|
||||||
ftdm_mutex_unlock(ftdmchan->mutex);
|
ftdm_mutex_unlock(ftdmchan->mutex);
|
||||||
return FTDM_SUCCESS;
|
return FTDM_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -2642,7 +2637,6 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_close(ftdm_channel_t **ftdmchan)
|
|||||||
if (ftdm_test_flag(check, FTDM_CHANNEL_OPEN)) {
|
if (ftdm_test_flag(check, FTDM_CHANNEL_OPEN)) {
|
||||||
status = check->fio->close(check);
|
status = check->fio->close(check);
|
||||||
if (status == FTDM_SUCCESS) {
|
if (status == FTDM_SUCCESS) {
|
||||||
ftdm_clear_flag(check, FTDM_CHANNEL_INUSE);
|
|
||||||
ftdm_channel_done(check);
|
ftdm_channel_done(check);
|
||||||
*ftdmchan = NULL;
|
*ftdmchan = NULL;
|
||||||
}
|
}
|
||||||
|
@ -156,7 +156,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
release_request_id((m3ua_request_id_t)ftdmchan->extra_id);
|
release_request_id((m3ua_request_id_t)ftdmchan->extra_id);
|
||||||
ftdmchan->extra_id = 0;
|
ftdmchan->extra_id = 0;
|
||||||
}
|
}
|
||||||
ftdm_channel_close(ftdmchan);
|
ftdm_channel_close(&ftdmchan);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case FTDM_CHANNEL_STATE_PROGRESS_MEDIA:
|
case FTDM_CHANNEL_STATE_PROGRESS_MEDIA:
|
||||||
|
@ -1325,7 +1325,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
}
|
}
|
||||||
Q931ReleaseCRV(&isdn_data->q931, gen->CRV);
|
Q931ReleaseCRV(&isdn_data->q931, gen->CRV);
|
||||||
}
|
}
|
||||||
ftdm_channel_close(ftdmchan);
|
ftdm_channel_close(&ftdmchan);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case FTDM_CHANNEL_STATE_PROGRESS:
|
case FTDM_CHANNEL_STATE_PROGRESS:
|
||||||
|
@ -281,11 +281,11 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
switch (ftdmchan->state) {
|
switch (ftdmchan->state) {
|
||||||
case FTDM_CHANNEL_STATE_DOWN:
|
case FTDM_CHANNEL_STATE_DOWN:
|
||||||
{
|
{
|
||||||
ftdm_channel_close(ftdmchan);
|
|
||||||
ftdmchan->call_data = NULL;
|
ftdmchan->call_data = NULL;
|
||||||
|
ftdm_channel_close(&ftdmchan);
|
||||||
|
|
||||||
ftdm_channel_close(peerchan);
|
|
||||||
peerchan->call_data = NULL;
|
peerchan->call_data = NULL;
|
||||||
|
ftdm_channel_close(&peerchan);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -839,7 +839,7 @@ static void handle_call_released(ftdm_span_t *span, sangomabc_connection_t *mcon
|
|||||||
if ((ftdmchan = find_ftdmchan(span, event, 1))) {
|
if ((ftdmchan = find_ftdmchan(span, event, 1))) {
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Releasing completely chan s%dc%d\n", BOOST_EVENT_SPAN(mcon->sigmod, event),
|
ftdm_log(FTDM_LOG_DEBUG, "Releasing completely chan s%dc%d\n", BOOST_EVENT_SPAN(mcon->sigmod, event),
|
||||||
BOOST_EVENT_CHAN(mcon->sigmod, event));
|
BOOST_EVENT_CHAN(mcon->sigmod, event));
|
||||||
ftdm_channel_close(ftdmchan);
|
ftdm_channel_close(&ftdmchan);
|
||||||
} else {
|
} else {
|
||||||
ftdm_log(FTDM_LOG_CRIT, "Odd, We could not find chan: s%dc%d to release the call completely!!\n",
|
ftdm_log(FTDM_LOG_CRIT, "Odd, We could not find chan: s%dc%d to release the call completely!!\n",
|
||||||
BOOST_EVENT_SPAN(mcon->sigmod, event), BOOST_EVENT_CHAN(mcon->sigmod, event));
|
BOOST_EVENT_SPAN(mcon->sigmod, event), BOOST_EVENT_CHAN(mcon->sigmod, event));
|
||||||
@ -1105,8 +1105,9 @@ static void handle_call_loop_start(ftdm_span_t *span, sangomabc_connection_t *mc
|
|||||||
|
|
||||||
ftdm_set_state_r(ftdmchan, FTDM_CHANNEL_STATE_IN_LOOP, res);
|
ftdm_set_state_r(ftdmchan, FTDM_CHANNEL_STATE_IN_LOOP, res);
|
||||||
if (res != FTDM_SUCCESS) {
|
if (res != FTDM_SUCCESS) {
|
||||||
|
ftdm_channel_t *toclose = ftdmchan;
|
||||||
ftdm_log(FTDM_LOG_CRIT, "yay, could not set the state of the channel to IN_LOOP, loop will fail\n");
|
ftdm_log(FTDM_LOG_CRIT, "yay, could not set the state of the channel to IN_LOOP, loop will fail\n");
|
||||||
ftdm_channel_close(ftdmchan);
|
ftdm_channel_close(&toclose);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "%d:%d starting loop\n", ftdmchan->span_id, ftdmchan->chan_id);
|
ftdm_log(FTDM_LOG_DEBUG, "%d:%d starting loop\n", ftdmchan->span_id, ftdmchan->chan_id);
|
||||||
@ -1430,7 +1431,8 @@ static __inline__ ftdm_status_t state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
ftdm_log(FTDM_LOG_DEBUG, "Waiting for call release confirmation before declaring chan %d:%d as available \n",
|
ftdm_log(FTDM_LOG_DEBUG, "Waiting for call release confirmation before declaring chan %d:%d as available \n",
|
||||||
ftdmchan->span_id, ftdmchan->chan_id);
|
ftdmchan->span_id, ftdmchan->chan_id);
|
||||||
} else {
|
} else {
|
||||||
ftdm_channel_close(ftdmchan);
|
ftdm_channel_t *toclose = ftdmchan;
|
||||||
|
ftdm_channel_close(&toclose);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user