]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: Fix gsm hangup race
authorMoises Silva <moy@sangoma.com>
Wed, 24 Jun 2015 05:50:34 +0000 (01:50 -0400)
committerMoises Silva <moy@sangoma.com>
Wed, 24 Jun 2015 05:52:08 +0000 (01:52 -0400)
libs/freetdm/src/ftmod/ftmod_gsm/ftmod_gsm.c

index 4b8c9b6df74c727c13ef122e02d56c5ed4bdd964..6eb194f067fc2afa709fb89fae11fd3f39b57aaf 100755 (executable)
@@ -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)