freetdm: fixing more potential null pointers in native bridge mode.

This commit is contained in:
James Zhang 2012-03-27 18:00:24 -04:00
parent bfefbb5522
commit a2db3c24b3
2 changed files with 42 additions and 29 deletions

View File

@ -426,24 +426,33 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj)
/* note that the channels being dequeued here may not belong to this span /* note that the channels being dequeued here may not belong to this span
they may belong to just about any other span that one of our channels they may belong to just about any other span that one of our channels
happens to be bridged to */ happens to be bridged to */
sngss7_chan_data_t *peer_info = peerchan->call_data; sngss7_chan_data_t *peer_info;
sngss7_chan_data_t *chan_info = peer_info->peer_data; sngss7_chan_data_t *chan_info;
ftdmchan = chan_info->ftdmchan;
/* peer_info = peerchan->call_data;
if there is any state changes at all, those will be done in the opposite channel if (peer_info) {
to peerchan (where the original event was received), therefore we must lock ftdmchan, chan_info = peer_info->peer_data;
but do not need to lock peerchan as we only read its event queue, which is already if (chan_info) {
locked when dequeueing */ ftdmchan = chan_info->ftdmchan;
ftdm_channel_lock(ftdmchan); if (ftdmchan) {
/* clean out all pending stack events in the peer channel */ /*
while ((sngss7_event = ftdm_queue_dequeue(peer_info->event_queue))) { if there is any state changes at all, those will be done in the opposite channel
ftdm_sangoma_ss7_process_peer_stack_event(ftdmchan, sngss7_event); to peerchan (where the original event was received), therefore we must lock ftdmchan,
ftdm_safe_free(sngss7_event); but do not need to lock peerchan as we only read its event queue, which is already
locked when dequeueing */
ftdm_channel_lock(ftdmchan);
/* clean out all pending stack events in the peer channel */
while ((sngss7_event = ftdm_queue_dequeue(peer_info->event_queue))) {
ftdm_sangoma_ss7_process_peer_stack_event(ftdmchan, sngss7_event);
ftdm_safe_free(sngss7_event);
}
ftdm_channel_unlock(ftdmchan);
}
}
} }
ftdm_channel_unlock(ftdmchan);
} }
/* clean out all pending stack events */ /* clean out all pending stack events */
@ -1519,9 +1528,11 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan)
*/ */
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) { if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
sngss7_chan_data_t *peer_info = sngss7_info->peer_data; sngss7_chan_data_t *peer_info = sngss7_info->peer_data;
sngss7_info->peer_data = NULL;
if (peer_info) { if (peer_info) {
peer_info->peer_data = NULL; sngss7_info->peer_data = NULL;
if (peer_info) {
peer_info->peer_data = NULL;
}
} }
} }

View File

@ -72,21 +72,23 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
var, peer_span->signal_type); var, peer_span->signal_type);
} else { } else {
peer_info = peer_chan->call_data; peer_info = peer_chan->call_data;
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Starting native bridge with peer CIC %d\n", if (peer_info) {
sngss7_info->circuit->cic, peer_info->circuit->cic); SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Starting native bridge with peer CIC %d\n",
sngss7_info->circuit->cic, peer_info->circuit->cic);
/* make each one of us aware of the native bridge */ /* make each one of us aware of the native bridge */
peer_info->peer_data = sngss7_info; peer_info->peer_data = sngss7_info;
sngss7_info->peer_data = peer_info; sngss7_info->peer_data = peer_info;
/* flush our own queue */ /* flush our own queue */
sngss7_flush_queue(sngss7_info->event_queue); sngss7_flush_queue(sngss7_info->event_queue);
/* Go to up until release comes, note that state processing is done different and much simpler when there is a peer, /* Go to up until release comes, note that state processing is done different and much simpler when there is a peer,
We can't go to UP state right away yet though, so do not set the state to UP here, wait until the end of this function We can't go to UP state right away yet though, so do not set the state to UP here, wait until the end of this function
because moving from one state to another causes the ftdmchan->usrmsg structure to be wiped because moving from one state to another causes the ftdmchan->usrmsg structure to be wiped
and we still need those variables for further IAM processing */ and we still need those variables for further IAM processing */
native_going_up = FTDM_TRUE; native_going_up = FTDM_TRUE;
}
} }
} }
} }