summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorzuul <zuul@gerrit.asterisk.org>2016-04-25 22:00:51 -0500
committerGerrit Code Review <gerrit2@gerrit.digium.api>2016-04-25 22:00:51 -0500
commit0f2978510149b259a8f76f85da6a1cff6a0f29b1 (patch)
treedf3fe3ffae6ff1d843c5f48732d3365ee4720205 /main
parent811e24f595701c0518f1711881d9537b46a0b201 (diff)
parentb3cc74fda954b330944397d5bbca4ff98698661f (diff)
Merge "manager_channels.c: Fix allocation failure crash."
Diffstat (limited to 'main')
-rw-r--r--main/manager_channels.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/main/manager_channels.c b/main/manager_channels.c
index da9bf476d..c395708cc 100644
--- a/main/manager_channels.c
+++ b/main/manager_channels.c
@@ -697,28 +697,33 @@ static void channel_hangup_request_cb(void *data,
struct stasis_message *message)
{
struct ast_channel_blob *obj = stasis_message_data(message);
- RAII_VAR(struct ast_str *, extra, NULL, ast_free);
- RAII_VAR(struct ast_str *, channel_event_string, NULL, ast_free);
+ struct ast_str *extra;
+ struct ast_str *channel_event_string;
struct ast_json *cause;
int is_soft;
char *manager_event = "HangupRequest";
+ if (!obj->snapshot) {
+ /* No snapshot? Likely an earlier allocation failure creating it. */
+ return;
+ }
+
extra = ast_str_create(20);
if (!extra) {
return;
}
channel_event_string = ast_manager_build_channel_state_string(obj->snapshot);
-
if (!channel_event_string) {
+ ast_free(extra);
return;
}
cause = ast_json_object_get(obj->blob, "cause");
if (cause) {
ast_str_append(&extra, 0,
- "Cause: %jd\r\n",
- ast_json_integer_get(cause));
+ "Cause: %jd\r\n",
+ ast_json_integer_get(cause));
}
is_soft = ast_json_is_true(ast_json_object_get(obj->blob, "soft"));
@@ -727,9 +732,12 @@ static void channel_hangup_request_cb(void *data,
}
manager_event(EVENT_FLAG_CALL, manager_event,
- "%s%s",
- ast_str_buffer(channel_event_string),
- ast_str_buffer(extra));
+ "%s%s",
+ ast_str_buffer(channel_event_string),
+ ast_str_buffer(extra));
+
+ ast_free(channel_event_string);
+ ast_free(extra);
}
static void channel_chanspy_stop_cb(void *data, struct stasis_subscription *sub,