mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-04-15 08:29:45 +00:00
Try to fix pritap segfault
This commit is contained in:
parent
0a92094995
commit
3cb1fd267f
@ -297,13 +297,19 @@ static ftdm_status_t state_advance(ftdm_channel_t *ftdmchan)
|
|||||||
switch (ftdmchan->state) {
|
switch (ftdmchan->state) {
|
||||||
case FTDM_CHANNEL_STATE_DOWN:
|
case FTDM_CHANNEL_STATE_DOWN:
|
||||||
{
|
{
|
||||||
|
ftdm_channel_t *fchan = ftdmchan;
|
||||||
|
|
||||||
ftdmchan->call_data = NULL;
|
ftdmchan->call_data = NULL;
|
||||||
ftdmchan->pflags = 0;
|
ftdmchan->pflags = 0;
|
||||||
ftdm_channel_close(&ftdmchan);
|
ftdm_channel_close(&fchan);
|
||||||
|
|
||||||
peerchan->call_data = NULL;
|
if (peerchan) {
|
||||||
peerchan->pflags = 0;
|
peerchan->call_data = NULL;
|
||||||
ftdm_channel_close(&peerchan);
|
peerchan->pflags = 0;
|
||||||
|
ftdm_channel_close(&peerchan);
|
||||||
|
} else {
|
||||||
|
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_ERROR, "Odd, no peer chan\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -597,6 +603,8 @@ static void handle_pri_passive_event(pritap_t *pritap, pri_event *e)
|
|||||||
ftdm_log(FTDM_LOG_DEBUG, "Ignoring duplicated proceeding with callref %d\n", crv);
|
ftdm_log(FTDM_LOG_DEBUG, "Ignoring duplicated proceeding with callref %d\n", crv);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
pcall->proceeding = 1;
|
||||||
|
|
||||||
peerpcall = tap_pri_get_pcall(pritap, NULL);
|
peerpcall = tap_pri_get_pcall(pritap, NULL);
|
||||||
if (!peerpcall) {
|
if (!peerpcall) {
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Failed to get a free peer PRI passive call slot for callref %d in span %s, this is a bug!\n",
|
ftdm_log(FTDM_LOG_ERROR, "Failed to get a free peer PRI passive call slot for callref %d in span %s, this is a bug!\n",
|
||||||
@ -625,7 +633,6 @@ static void handle_pri_passive_event(pritap_t *pritap, pri_event *e)
|
|||||||
pritap->span->name, PRI_SPAN(e->proceeding.channel), PRI_CHANNEL(e->proceeding.channel), crv);
|
pritap->span->name, PRI_SPAN(e->proceeding.channel), PRI_CHANNEL(e->proceeding.channel), crv);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pcall->fchan = fchan;
|
|
||||||
|
|
||||||
peerfchan = tap_pri_get_fchan(peertap, pcall, e->proceeding.channel);
|
peerfchan = tap_pri_get_fchan(peertap, pcall, e->proceeding.channel);
|
||||||
if (!peerfchan) {
|
if (!peerfchan) {
|
||||||
@ -633,11 +640,13 @@ static void handle_pri_passive_event(pritap_t *pritap, pri_event *e)
|
|||||||
peertap->span->name, PRI_SPAN(e->proceeding.channel), PRI_CHANNEL(e->proceeding.channel), crv);
|
peertap->span->name, PRI_SPAN(e->proceeding.channel), PRI_CHANNEL(e->proceeding.channel), crv);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
pcall->fchan = fchan;
|
||||||
peerpcall->fchan = fchan;
|
peerpcall->fchan = fchan;
|
||||||
|
|
||||||
fchan->call_data = peerfchan;
|
fchan->call_data = peerfchan;
|
||||||
peerfchan->call_data = fchan;
|
peerfchan->call_data = fchan;
|
||||||
|
|
||||||
|
ftdm_log_chan_msg(pcall->fchan, FTDM_LOG_NOTICE, "Starting new tapped call\n");
|
||||||
ftdm_set_state_locked(fchan, FTDM_CHANNEL_STATE_RING);
|
ftdm_set_state_locked(fchan, FTDM_CHANNEL_STATE_RING);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -651,6 +660,12 @@ static void handle_pri_passive_event(pritap_t *pritap, pri_event *e)
|
|||||||
pritap->span->name, PRI_SPAN(e->proceeding.channel), PRI_CHANNEL(e->proceeding.channel), crv);
|
pritap->span->name, PRI_SPAN(e->proceeding.channel), PRI_CHANNEL(e->proceeding.channel), crv);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (!pcall->fchan) {
|
||||||
|
ftdm_log(FTDM_LOG_ERROR,
|
||||||
|
"Received answer in channel %s:%d:%d for callref %d but we never got a channel",
|
||||||
|
pritap->span->name, PRI_SPAN(e->proceeding.channel), PRI_CHANNEL(e->proceeding.channel), crv);
|
||||||
|
break;
|
||||||
|
}
|
||||||
ftdm_log_chan(pcall->fchan, FTDM_LOG_NOTICE, "Tapped call was answered in state %s\n", ftdm_channel_state2str(pcall->fchan->state));
|
ftdm_log_chan(pcall->fchan, FTDM_LOG_NOTICE, "Tapped call was answered in state %s\n", ftdm_channel_state2str(pcall->fchan->state));
|
||||||
ftdm_set_pflag_locked(pcall->fchan, PRITAP_NETWORK_ANSWER);
|
ftdm_set_pflag_locked(pcall->fchan, PRITAP_NETWORK_ANSWER);
|
||||||
ftdm_set_state_locked(pcall->fchan, FTDM_CHANNEL_STATE_UP);
|
ftdm_set_state_locked(pcall->fchan, FTDM_CHANNEL_STATE_UP);
|
||||||
@ -668,6 +683,13 @@ static void handle_pri_passive_event(pritap_t *pritap, pri_event *e)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!pcall->fchan) {
|
||||||
|
ftdm_log(FTDM_LOG_DEBUG,
|
||||||
|
"ignoring hangup in channel %s:%d:%d for callref %d since we never got a channel",
|
||||||
|
pritap->span->name, PRI_SPAN(e->proceeding.channel), PRI_CHANNEL(e->proceeding.channel), crv);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
fchan = pcall->fchan;
|
fchan = pcall->fchan;
|
||||||
ftdm_set_state_locked(fchan, FTDM_CHANNEL_STATE_TERMINATING);
|
ftdm_set_state_locked(fchan, FTDM_CHANNEL_STATE_TERMINATING);
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user