From: Moises Silva Date: Wed, 24 Jun 2015 05:50:34 +0000 (-0400) Subject: freetdm: Fix gsm hangup race X-Git-Tag: v1.6.2~396 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e401b1469fee10ec6508aca5d2cc1ceba0d35cf0;p=thirdparty%2Ffreeswitch.git freetdm: Fix gsm hangup race --- diff --git a/libs/freetdm/src/ftmod/ftmod_gsm/ftmod_gsm.c b/libs/freetdm/src/ftmod/ftmod_gsm/ftmod_gsm.c index 4b8c9b6df7..6eb194f067 100755 --- a/libs/freetdm/src/ftmod/ftmod_gsm/ftmod_gsm.c +++ b/libs/freetdm/src/ftmod/ftmod_gsm/ftmod_gsm.c @@ -193,7 +193,8 @@ int on_wat_span_write(unsigned char span_id, void *buffer, unsigned len) gsm_data = span->signal_data; status = ftdm_channel_write(gsm_data->dchan, (void *)buffer, len, &outsize); if (status != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_ERROR, "Failed to write %d bytes to d-channel in span %s\n", len, span->name); + char errbuf[255]; + ftdm_log(FTDM_LOG_ERROR, "Failed to write %d bytes to d-channel in span %s: %s\n", len, span->name, strerror_r(errno, errbuf, sizeof(errbuf))); return -1; } return len; @@ -345,13 +346,16 @@ void on_wat_rel_ind(unsigned char span_id, uint8_t call_id, wat_rel_event_t *rel ftdm_log(FTDM_LOG_INFO, "s%d: Call hangup (id:%d) cause:%d\n", span_id, call_id, rel_event->cause); - if(!(span = GetSpanByID(span_id, &gsm_data))) { + if (!(span = GetSpanByID(span_id, &gsm_data))) { return; } - ftdm_set_state(gsm_data->bchan, FTDM_CHANNEL_STATE_HANGUP); + if (gsm_data->bchan->state == FTDM_CHANNEL_STATE_HANGUP || + gsm_data->bchan->state == FTDM_CHANNEL_STATE_DOWN) { + return; + } - + ftdm_set_state(gsm_data->bchan, FTDM_CHANNEL_STATE_HANGUP); } void on_wat_rel_cfm(unsigned char span_id, uint8_t call_id)