]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Freetdm:fix for ftdm_channel_close not always passed double-pointer
authorDavid Yat Sin <dyatsin@sangoma.com>
Wed, 15 Dec 2010 17:56:49 +0000 (12:56 -0500)
committerDavid Yat Sin <dyatsin@sangoma.com>
Wed, 15 Dec 2010 17:56:49 +0000 (12:56 -0500)
libs/freetdm/src/ftdm_io.c
libs/freetdm/src/ftdm_m3ua.c
libs/freetdm/src/ftmod/ftmod_isdn/ftmod_isdn.c
libs/freetdm/src/ftmod/ftmod_pritap/ftmod_pritap.c
libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c

index 4bd0fdd33e3f8ee047fa7c9725f458ac4a055fa1..eaf057e8a8f52fb1dc23e547bd2e29ae2e8e91da 100644 (file)
@@ -2430,14 +2430,9 @@ FT_DECLARE(ftdm_status_t) _ftdm_channel_call_send_msg(const char *file, const ch
 FT_DECLARE(ftdm_status_t) _ftdm_channel_reset(const char *file, const char *func, int line, ftdm_channel_t *ftdmchan)
 {
        ftdm_assert_return(ftdmchan != NULL, FTDM_FAIL, "null channel");
-#ifdef __WINDOWS__
-       UNREFERENCED_PARAMETER(file);
-       UNREFERENCED_PARAMETER(func);
-       UNREFERENCED_PARAMETER(line);
-#endif
 
        ftdm_channel_lock(ftdmchan);
-       ftdm_channel_set_state(file, func, line, ftdmchan, FTDM_CHANNEL_STATE_RESET, 0);
+       ftdm_channel_set_state(file, func, line, ftdmchan, FTDM_CHANNEL_STATE_RESET, 1);
        ftdm_channel_unlock(ftdmchan);
        return FTDM_SUCCESS;
 }
@@ -2578,8 +2573,7 @@ static ftdm_status_t ftdm_channel_done(ftdm_channel_t *ftdmchan)
                ftdm_log_chan(ftdmchan, FTDM_LOG_WARNING, "channel dropped data: txdrops = %d, rxdrops = %d\n",
                                ftdmchan->txdrops, ftdmchan->rxdrops);
        }
-
-       ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "channel done\n");
+       
        memset(&ftdmchan->caller_data, 0, sizeof(ftdmchan->caller_data));
 
        ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_HOLD);
@@ -2612,6 +2606,7 @@ static ftdm_status_t ftdm_channel_done(ftdm_channel_t *ftdmchan)
                ftdmchan->packet_len = ftdmchan->native_interval * (ftdmchan->effective_codec == FTDM_CODEC_SLIN ? 16 : 8);
                ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_TRANSCODE);
        }
+       ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "channel done\n");
        ftdm_mutex_unlock(ftdmchan->mutex);
        return FTDM_SUCCESS;
 }
@@ -2642,7 +2637,6 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_close(ftdm_channel_t **ftdmchan)
                if (ftdm_test_flag(check, FTDM_CHANNEL_OPEN)) {
                        status = check->fio->close(check);
                        if (status == FTDM_SUCCESS) {
-                               ftdm_clear_flag(check, FTDM_CHANNEL_INUSE);
                                ftdm_channel_done(check);
                                *ftdmchan = NULL;
                        }
index 5a468d1378bf4aebdb6b8d357e1d7c711478bda2..8d3e00213a7cafe607a4b88871231a37bf1c989e 100644 (file)
@@ -156,7 +156,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
                                release_request_id((m3ua_request_id_t)ftdmchan->extra_id);
                                ftdmchan->extra_id = 0;
                        }
-                       ftdm_channel_close(ftdmchan);                   
+                       ftdm_channel_close(&ftdmchan);                  
                }
                break;
        case FTDM_CHANNEL_STATE_PROGRESS_MEDIA:
index c6a0e5ff0e1a3404aca8a71c69ffab862f7ffda1..5b4ce7196a43f794f917ec58adc1587b4c0f8ab7 100644 (file)
@@ -1325,7 +1325,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
                                }
                                Q931ReleaseCRV(&isdn_data->q931, gen->CRV);
                        }
-                       ftdm_channel_close(ftdmchan);
+                       ftdm_channel_close(&ftdmchan);
                }
                break;
        case FTDM_CHANNEL_STATE_PROGRESS:
index b3b4f2a9dcc41cc125fdf2788ac1115a29599b40..27fbe2139f62f2dcea69925347bfa82774a64d0e 100644 (file)
@@ -280,12 +280,12 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
 
        switch (ftdmchan->state) {
        case FTDM_CHANNEL_STATE_DOWN:
-               {
-                       ftdm_channel_close(ftdmchan);                   
+               {                       
                        ftdmchan->call_data = NULL;
+                       ftdm_channel_close(&ftdmchan);
 
-                       ftdm_channel_close(peerchan);
                        peerchan->call_data = NULL;
+                       ftdm_channel_close(&peerchan);
                }
                break;
 
index a196725d4edcd2b9a830e052be2eb5f1460e3ace..f59b3b8c4f4b6537e92b1c46920d8d21af5290a9 100644 (file)
@@ -839,7 +839,7 @@ static void handle_call_released(ftdm_span_t *span, sangomabc_connection_t *mcon
        if ((ftdmchan = find_ftdmchan(span, event, 1))) {
                ftdm_log(FTDM_LOG_DEBUG, "Releasing completely chan s%dc%d\n", BOOST_EVENT_SPAN(mcon->sigmod, event), 
                                BOOST_EVENT_CHAN(mcon->sigmod, event));
-               ftdm_channel_close(ftdmchan);
+               ftdm_channel_close(&ftdmchan);
        } else {
                ftdm_log(FTDM_LOG_CRIT, "Odd, We could not find chan: s%dc%d to release the call completely!!\n", 
                                BOOST_EVENT_SPAN(mcon->sigmod, event), BOOST_EVENT_CHAN(mcon->sigmod, event));
@@ -1105,8 +1105,9 @@ static void handle_call_loop_start(ftdm_span_t *span, sangomabc_connection_t *mc
 
        ftdm_set_state_r(ftdmchan, FTDM_CHANNEL_STATE_IN_LOOP, res);
        if (res != FTDM_SUCCESS) {
+               ftdm_channel_t *toclose = ftdmchan;
                ftdm_log(FTDM_LOG_CRIT, "yay, could not set the state of the channel to IN_LOOP, loop will fail\n");
-               ftdm_channel_close(ftdmchan);
+               ftdm_channel_close(&toclose);
                return;
        }
        ftdm_log(FTDM_LOG_DEBUG, "%d:%d starting loop\n", ftdmchan->span_id, ftdmchan->chan_id);
@@ -1430,7 +1431,8 @@ static __inline__ ftdm_status_t state_advance(ftdm_channel_t *ftdmchan)
                                ftdm_log(FTDM_LOG_DEBUG, "Waiting for call release confirmation before declaring chan %d:%d as available \n", 
                                                ftdmchan->span_id, ftdmchan->chan_id);
                        } else {
-                               ftdm_channel_close(ftdmchan);
+                               ftdm_channel_t *toclose = ftdmchan;
+                               ftdm_channel_close(&toclose);
                        }
                }
                break;