diff options
author | rmudgett <rmudgett@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-05-25 16:23:51 +0000 |
---|---|---|
committer | rmudgett <rmudgett@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-05-25 16:23:51 +0000 |
commit | fb0a0c4c209d0f81b8b1e0fa0d24e72d9a58409c (patch) | |
tree | d74cb4f3465d2ab18505c997f7d8af124b7f39df /main | |
parent | 78b43f96d36ed707856f7f2b481ddabb9618538c (diff) |
Memory leak in connected line data when SIP blond transfer done.
The handling of the control subclass AST_CONTROL_READ_ACTION frame leaked
connected line string memory in __ast_read().
Also in __ast_read() the frame type switch should not have had a case for
AST_CONTROL_READ_ACTION. AST_CONTROL_READ_ACTION is not a frame type.
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@265608 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main')
-rw-r--r-- | main/channel.c | 34 |
1 files changed, 11 insertions, 23 deletions
diff --git a/main/channel.c b/main/channel.c index ba34117e0..1dbe11265 100644 --- a/main/channel.c +++ b/main/channel.c @@ -3476,18 +3476,22 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio) ast_cel_report_event(chan, AST_CEL_ANSWER, NULL, NULL, NULL); } } else if (f->subclass.integer == AST_CONTROL_READ_ACTION) { - ast_party_connected_line_init(&connected); read_action_payload = f->data.ptr; switch (read_action_payload->action) { case AST_FRAME_READ_ACTION_CONNECTED_LINE_MACRO: + ast_party_connected_line_init(&connected); + ast_party_connected_line_copy(&connected, &chan->connected); if (ast_connected_line_parse_data(read_action_payload->payload, - read_action_payload->payload_size, &connected)) { + read_action_payload->payload_size, &connected)) { + ast_party_connected_line_free(&connected); break; } if (ast_channel_connected_line_macro(NULL, chan, &connected, 1, 0)) { ast_indicate_data(chan, AST_CONTROL_CONNECTED_LINE, - read_action_payload->payload, read_action_payload->payload_size); + read_action_payload->payload, + read_action_payload->payload_size); } + ast_party_connected_line_free(&connected); break; } ast_frfree(f); @@ -3718,24 +3722,6 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio) ast_read_generator_actions(chan, f); } break; - case AST_CONTROL_READ_ACTION: - ast_log(LOG_NOTICE, "Read a read action frame\n"); - read_action_payload = f->data.ptr; - switch (read_action_payload->action) { - case AST_FRAME_READ_ACTION_CONNECTED_LINE_MACRO: - if (ast_connected_line_parse_data(read_action_payload->payload, - read_action_payload->payload_size, &connected)) { - break; - } - if (ast_channel_connected_line_macro(NULL, chan, &connected, 1, 0)) { - ast_indicate_data(chan, AST_CONTROL_CONNECTED_LINE, - read_action_payload->payload, read_action_payload->payload_size); - } - break; - } - ast_frfree(f); - f = &ast_null_frame; - break; default: /* Just pass it on! */ break; @@ -7893,10 +7879,10 @@ int ast_channel_connected_line_macro(struct ast_channel *autoservice_chan, struc ast_channel_lock(macro_chan); macro = pbx_builtin_getvar_helper(macro_chan, is_caller - ? "CONNECTED_LINE_CALLER_SEND_MACRO" : "CONNECTED_LINE_CALLEE_SEND_MACRO"); + ? "CONNECTED_LINE_CALLER_SEND_MACRO" : "CONNECTED_LINE_CALLEE_SEND_MACRO"); macro = ast_strdupa(S_OR(macro, "")); macro_args = pbx_builtin_getvar_helper(macro_chan, is_caller - ? "CONNECTED_LINE_CALLER_SEND_MACRO_ARSG" : "CONNECTED_LINE_CALLEE_SEND_MACRO_ARGS"); + ? "CONNECTED_LINE_CALLER_SEND_MACRO_ARSG" : "CONNECTED_LINE_CALLEE_SEND_MACRO_ARGS"); macro_args = ast_strdupa(S_OR(macro_args, "")); ast_channel_unlock(macro_chan); @@ -7906,9 +7892,11 @@ int ast_channel_connected_line_macro(struct ast_channel *autoservice_chan, struc if (is_frame) { const struct ast_frame *frame = connected_info; + ast_connected_line_parse_data(frame->data.ptr, frame->datalen, ¯o_chan->connected); } else { const struct ast_party_connected_line *connected = connected_info; + ast_party_connected_line_copy(¯o_chan->connected, connected); } |