Don't leak frames when memory is full in autoservice_run.

Review: https://reviewboard.asterisk.org/r/2566/


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@396505 65c4cc65-6c06-0410-ace0-fbb531ad65f3
changes/78/78/1
Walter Doekes 12 years ago
parent b3813c8bc5
commit e744fa5f5b

@ -144,9 +144,12 @@ static void *autoservice_run(void *ign)
defer_frame = &hangup_frame; defer_frame = &hangup_frame;
} else if (ast_is_deferrable_frame(f)) { } else if (ast_is_deferrable_frame(f)) {
defer_frame = f; defer_frame = f;
} else {
/* Can't defer. Discard and continue with next. */
ast_frfree(f);
continue;
} }
if (defer_frame) {
for (i = 0; i < x; i++) { for (i = 0; i < x; i++) {
struct ast_frame *dup_f; struct ast_frame *dup_f;
@ -154,24 +157,27 @@ static void *autoservice_run(void *ign)
continue; continue;
} }
if (defer_frame != f) { if (!f) { /* defer_frame == &hangup_frame */
if ((dup_f = ast_frdup(defer_frame))) { if ((dup_f = ast_frdup(defer_frame))) {
AST_LIST_INSERT_HEAD(&ents[i]->deferred_frames, dup_f, frame_list); AST_LIST_INSERT_HEAD(&ents[i]->deferred_frames, dup_f, frame_list);
} }
} else { } else {
if ((dup_f = ast_frisolate(defer_frame))) { if ((dup_f = ast_frisolate(defer_frame))) {
AST_LIST_INSERT_HEAD(&ents[i]->deferred_frames, dup_f, frame_list);
}
if (dup_f != defer_frame) { if (dup_f != defer_frame) {
ast_frfree(defer_frame); ast_frfree(defer_frame);
} }
AST_LIST_INSERT_HEAD(&ents[i]->deferred_frames, dup_f, frame_list);
}
} }
break; break;
} }
} else if (f) { /* The ast_waitfor_n() call will only read frames from
ast_frfree(f); * the channels' file descriptors. If ast_waitfor_n()
} * returns non-NULL, then one of the channels in the
* mons array must have triggered the return. It's
* therefore impossible that we got here while (i >= x).
* If we did, we'd need to ast_frfree(f) if (f). */
} }
if (callid) { if (callid) {

Loading…
Cancel
Save