From: James Zhang Date: Thu, 15 Mar 2012 22:05:47 +0000 (-0400) Subject: freetdm: fixing a potential crash on a rarely happened situation X-Git-Tag: v1.2.3^2~71^2^2~201^2~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=19f01bf50a1b478b7206f2b9f083b08ac357ff12;p=thirdparty%2Ffreeswitch.git freetdm: fixing a potential crash on a rarely happened situation --- diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c index cb5584760f..60b44cec1e 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c @@ -1314,6 +1314,10 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span, }else { stream->write_function(stream, "relay=N"); } + +#ifdef SMG_RELAY_DBG + stream->write_function(stream, "| flag=0x%llx", ftdmchan->flags); +#endif } #ifdef SMG_RELAY_DBG diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c index fa36c7280a..ecd83a14d4 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c @@ -614,20 +614,22 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev break; case SNGSS7_REL_CFM_EVENT: { - ftdm_channel_t *peer_chan = sngss7_info->peer_data->ftdmchan; - ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN); - if (peer_chan) { - /* we need to unlock our chan or we risk deadlock */ - ftdm_channel_advance_states(ftdmchan); - ftdm_channel_unlock(ftdmchan); - - ftdm_channel_lock(peer_chan); - if (peer_chan->state != FTDM_CHANNEL_STATE_DOWN) { - ftdm_set_state(peer_chan, FTDM_CHANNEL_STATE_DOWN); - } - ftdm_channel_unlock(peer_chan); + if (sngss7_info->peer_data) { + ftdm_channel_t *peer_chan = sngss7_info->peer_data->ftdmchan; + ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN); + if (peer_chan) { + /* we need to unlock our chan or we risk deadlock */ + ftdm_channel_advance_states(ftdmchan); + ftdm_channel_unlock(ftdmchan); + + ftdm_channel_lock(peer_chan); + if (peer_chan->state != FTDM_CHANNEL_STATE_DOWN) { + ftdm_set_state(peer_chan, FTDM_CHANNEL_STATE_DOWN); + } + ftdm_channel_unlock(peer_chan); - ftdm_channel_lock(ftdmchan); + ftdm_channel_lock(ftdmchan); + } } } break;