diff options
author | zuul <zuul@gerrit.asterisk.org> | 2016-04-25 22:00:51 -0500 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2016-04-25 22:00:51 -0500 |
commit | 0f2978510149b259a8f76f85da6a1cff6a0f29b1 (patch) | |
tree | df3fe3ffae6ff1d843c5f48732d3365ee4720205 /main | |
parent | 811e24f595701c0518f1711881d9537b46a0b201 (diff) | |
parent | b3cc74fda954b330944397d5bbca4ff98698661f (diff) |
Merge "manager_channels.c: Fix allocation failure crash."
Diffstat (limited to 'main')
-rw-r--r-- | main/manager_channels.c | 24 |
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, |