From 7b4136550116855a2d8cbff882abc3dc04ac6702 Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Mon, 13 Jan 2014 11:02:22 -0500 Subject: [PATCH] FS-6051 --resolve mod_rayo - double destroy of output component --- src/mod/event_handlers/mod_rayo/mod_rayo.h | 2 ++ .../event_handlers/mod_rayo/rayo_components.c | 1 + .../mod_rayo/rayo_output_component.c | 20 +++++++++++-------- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/mod/event_handlers/mod_rayo/mod_rayo.h b/src/mod/event_handlers/mod_rayo/mod_rayo.h index 9d0bf05490..d5dcdc4e8d 100644 --- a/src/mod/event_handlers/mod_rayo/mod_rayo.h +++ b/src/mod/event_handlers/mod_rayo/mod_rayo.h @@ -122,6 +122,8 @@ struct rayo_component { const char *client_jid; /** external ref */ const char *ref; + /** true if component has completed */ + int complete; /** optional cleanup */ rayo_actor_cleanup_fn cleanup_fn; }; diff --git a/src/mod/event_handlers/mod_rayo/rayo_components.c b/src/mod/event_handlers/mod_rayo/rayo_components.c index 7ad96d2a7d..ac1c66175d 100644 --- a/src/mod/event_handlers/mod_rayo/rayo_components.c +++ b/src/mod/event_handlers/mod_rayo/rayo_components.c @@ -112,6 +112,7 @@ iks *rayo_component_create_complete_event(struct rayo_component *component, cons */ void rayo_component_send_complete_event(struct rayo_component *component, iks *response) { + component->complete = 1; RAYO_SEND_REPLY(component, iks_find_attrib(response, "to"), response); RAYO_UNLOCK(component); RAYO_DESTROY(component); diff --git a/src/mod/event_handlers/mod_rayo/rayo_output_component.c b/src/mod/event_handlers/mod_rayo/rayo_output_component.c index 10edca029c..971dd296cf 100644 --- a/src/mod/event_handlers/mod_rayo/rayo_output_component.c +++ b/src/mod/event_handlers/mod_rayo/rayo_output_component.c @@ -105,15 +105,19 @@ static iks *start_call_output(struct rayo_component *component, switch_core_sess if (switch_ivr_displace_session(session, stream.data, 0, "m") == SWITCH_STATUS_SUCCESS) { RAYO_UNLOCK(component); } else { - if (OUTPUT_COMPONENT(component)->document) { - iks_delete(OUTPUT_COMPONENT(component)->document); - } - if (switch_channel_get_state(switch_core_session_get_channel(session)) >= CS_HANGUP) { - rayo_component_send_complete(component, COMPONENT_COMPLETE_HANGUP); - component = NULL; + if (component->complete) { + /* component is already destroyed */ + RAYO_UNLOCK(component); } else { - rayo_component_send_complete(component, COMPONENT_COMPLETE_ERROR); - component = NULL; + /* need to destroy component */ + if (OUTPUT_COMPONENT(component)->document) { + iks_delete(OUTPUT_COMPONENT(component)->document); + } + if (switch_channel_get_state(switch_core_session_get_channel(session)) >= CS_HANGUP) { + rayo_component_send_complete(component, COMPONENT_COMPLETE_HANGUP); + } else { + rayo_component_send_complete(component, COMPONENT_COMPLETE_ERROR); + } } } switch_safe_free(stream.data);