mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-05-31 18:55:49 +00:00
ftmod_libpri: Fix channel iterator memory leak
Keep the original iterator around to be able to actually free it after use. Signed-off-by: Stefan Knoblich <stkn@openisdn.net>
This commit is contained in:
parent
424850f688
commit
bf0b3291bb
@ -1667,7 +1667,7 @@ out:
|
|||||||
*/
|
*/
|
||||||
static ftdm_channel_t *find_channel_by_cref(ftdm_span_t *span, const int cref)
|
static ftdm_channel_t *find_channel_by_cref(ftdm_span_t *span, const int cref)
|
||||||
{
|
{
|
||||||
ftdm_iterator_t *iter = NULL;
|
ftdm_iterator_t *c_iter, *c_cur;
|
||||||
ftdm_channel_t *chan = NULL;
|
ftdm_channel_t *chan = NULL;
|
||||||
|
|
||||||
if (!span || cref <= 0)
|
if (!span || cref <= 0)
|
||||||
@ -1675,9 +1675,11 @@ static ftdm_channel_t *find_channel_by_cref(ftdm_span_t *span, const int cref)
|
|||||||
|
|
||||||
ftdm_mutex_lock(span->mutex);
|
ftdm_mutex_lock(span->mutex);
|
||||||
|
|
||||||
|
c_iter = ftdm_span_get_chan_iterator(span, NULL);
|
||||||
|
|
||||||
/* Iterate over all channels on this span */
|
/* Iterate over all channels on this span */
|
||||||
for (iter = ftdm_span_get_chan_iterator(span, NULL); iter; iter = ftdm_iterator_next(iter)) {
|
for (c_cur = c_iter; c_cur; c_cur = ftdm_iterator_next(c_cur)) {
|
||||||
ftdm_channel_t *cur = ftdm_iterator_current(iter);
|
ftdm_channel_t *cur = ftdm_iterator_current(c_cur);
|
||||||
ftdm_caller_data_t *caller_data = NULL;
|
ftdm_caller_data_t *caller_data = NULL;
|
||||||
|
|
||||||
if (ftdm_channel_get_type(cur) != FTDM_CHAN_TYPE_B)
|
if (ftdm_channel_get_type(cur) != FTDM_CHAN_TYPE_B)
|
||||||
@ -1691,7 +1693,7 @@ static ftdm_channel_t *find_channel_by_cref(ftdm_span_t *span, const int cref)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ftdm_iterator_free(iter);
|
ftdm_iterator_free(c_iter);
|
||||||
ftdm_mutex_unlock(span->mutex);
|
ftdm_mutex_unlock(span->mutex);
|
||||||
return chan;
|
return chan;
|
||||||
}
|
}
|
||||||
@ -1709,7 +1711,7 @@ static ftdm_channel_t *find_channel_by_cref(ftdm_span_t *span, const int cref)
|
|||||||
*/
|
*/
|
||||||
static ftdm_status_t hunt_channel(ftdm_span_t *span, const int hint, const ftdm_bool_t excl, ftdm_channel_t **chan)
|
static ftdm_status_t hunt_channel(ftdm_span_t *span, const int hint, const ftdm_bool_t excl, ftdm_channel_t **chan)
|
||||||
{
|
{
|
||||||
ftdm_iterator_t *iter = NULL;
|
ftdm_iterator_t *c_iter, *c_cur;
|
||||||
ftdm_channel_t *tmp = NULL;
|
ftdm_channel_t *tmp = NULL;
|
||||||
int ret = FTDM_FAIL;
|
int ret = FTDM_FAIL;
|
||||||
|
|
||||||
@ -1737,9 +1739,11 @@ static ftdm_status_t hunt_channel(ftdm_span_t *span, const int hint, const ftdm_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c_iter = ftdm_span_get_chan_iterator(span, NULL);
|
||||||
|
|
||||||
/* Iterate over all channels on this span */
|
/* Iterate over all channels on this span */
|
||||||
for (iter = ftdm_span_get_chan_iterator(span, NULL); iter; iter = ftdm_iterator_next(iter)) {
|
for (c_cur = c_iter; c_cur; c_cur = ftdm_iterator_next(c_cur)) {
|
||||||
tmp = ftdm_iterator_current(iter);
|
tmp = ftdm_iterator_current(c_cur);
|
||||||
|
|
||||||
if (ftdm_channel_get_type(tmp) != FTDM_CHAN_TYPE_B)
|
if (ftdm_channel_get_type(tmp) != FTDM_CHAN_TYPE_B)
|
||||||
continue;
|
continue;
|
||||||
@ -1752,7 +1756,7 @@ static ftdm_status_t hunt_channel(ftdm_span_t *span, const int hint, const ftdm_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ftdm_iterator_free(iter);
|
ftdm_iterator_free(c_iter);
|
||||||
out:
|
out:
|
||||||
ftdm_mutex_unlock(span->mutex);
|
ftdm_mutex_unlock(span->mutex);
|
||||||
return ret;
|
return ret;
|
||||||
@ -1969,14 +1973,16 @@ static int on_timeout_t3xx(struct lpwrap_pri *spri, struct lpwrap_timer *timer)
|
|||||||
{
|
{
|
||||||
ftdm_span_t *span = spri->span;
|
ftdm_span_t *span = spri->span;
|
||||||
ftdm_libpri_data_t *isdn_data = span->signal_data;
|
ftdm_libpri_data_t *isdn_data = span->signal_data;
|
||||||
ftdm_iterator_t *iter = NULL;
|
ftdm_iterator_t *c_iter, *c_cur;
|
||||||
|
|
||||||
ftdm_log_chan_msg(isdn_data->dchan, FTDM_LOG_INFO, "-- T3xx timed out, restarting idle b-channels\n");
|
ftdm_log_chan_msg(isdn_data->dchan, FTDM_LOG_INFO, "-- T3xx timed out, restarting idle b-channels\n");
|
||||||
ftdm_mutex_lock(span->mutex);
|
ftdm_mutex_lock(span->mutex);
|
||||||
|
|
||||||
|
c_iter = ftdm_span_get_chan_iterator(span, NULL);
|
||||||
|
|
||||||
/* Iterate b-channels */
|
/* Iterate b-channels */
|
||||||
for (iter = ftdm_span_get_chan_iterator(span, NULL); iter; iter = ftdm_iterator_next(iter)) {
|
for (c_cur = c_iter; c_cur; c_cur = ftdm_iterator_next(c_cur)) {
|
||||||
ftdm_channel_t *cur = ftdm_iterator_current(iter);
|
ftdm_channel_t *cur = ftdm_iterator_current(c_cur);
|
||||||
/* Skip non-b-channels */
|
/* Skip non-b-channels */
|
||||||
if (ftdm_channel_get_type(cur) != FTDM_CHAN_TYPE_B)
|
if (ftdm_channel_get_type(cur) != FTDM_CHAN_TYPE_B)
|
||||||
continue;
|
continue;
|
||||||
@ -1985,7 +1991,7 @@ static int on_timeout_t3xx(struct lpwrap_pri *spri, struct lpwrap_timer *timer)
|
|||||||
ftdm_set_state_locked(cur, FTDM_CHANNEL_STATE_RESTART);
|
ftdm_set_state_locked(cur, FTDM_CHANNEL_STATE_RESTART);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ftdm_iterator_free(iter);
|
ftdm_iterator_free(c_iter);
|
||||||
ftdm_mutex_unlock(span->mutex);
|
ftdm_mutex_unlock(span->mutex);
|
||||||
|
|
||||||
/* Start timer again */
|
/* Start timer again */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user