提交 bf0b3291 authored 作者: Stefan Knoblich's avatar Stefan Knoblich

ftmod_libpri: Fix channel iterator memory leak

Keep the original iterator around to be able to actually free it
after use.
Signed-off-by: 's avatarStefan Knoblich <stkn@openisdn.net>
上级 424850f6
...@@ -1667,7 +1667,7 @@ out: ...@@ -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) ...@@ -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) ...@@ -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,8 +1711,8 @@ static ftdm_channel_t *find_channel_by_cref(ftdm_span_t *span, const int cref) ...@@ -1709,8 +1711,8 @@ 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;
/* lock span */ /* lock span */
...@@ -1737,9 +1739,11 @@ static ftdm_status_t hunt_channel(ftdm_span_t *span, const int hint, const ftdm_ ...@@ -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_ ...@@ -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) ...@@ -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) ...@@ -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 */
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论