[svn-commits] rmudgett: trunk r265608 - /trunk/main/channel.c
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Tue May 25 11:23:53 CDT 2010
Author: rmudgett
Date: Tue May 25 11:23:51 2010
New Revision: 265608
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=265608
Log:
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.
Modified:
trunk/main/channel.c
Modified: trunk/main/channel.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/channel.c?view=diff&rev=265608&r1=265607&r2=265608
==============================================================================
--- trunk/main/channel.c (original)
+++ trunk/main/channel.c Tue May 25 11:23:51 2010
@@ -3476,18 +3476,22 @@
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 @@
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 @@
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 @@
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);
}
More information about the svn-commits
mailing list