From bf201fc03525a5da7b460d081a99344bc6cad724 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 16 Dec 2008 20:59:00 +0000 Subject: [PATCH] fix potential race git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@10828 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/mod/endpoints/mod_sofia/mod_sofia.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 86f4d558c1..b3575dced9 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -373,6 +373,8 @@ switch_status_t sofia_on_hangup(switch_core_session_t *session) switch_safe_free(stream.data); } + switch_clear_flag(tech_pvt, TFLAG_IO); + if (tech_pvt->read_codec.implementation) { switch_core_codec_destroy(&tech_pvt->read_codec); } @@ -385,7 +387,6 @@ switch_status_t sofia_on_hangup(switch_core_session_t *session) switch_core_session_unset_write_codec(session); switch_mutex_lock(tech_pvt->profile->flag_mutex); - switch_clear_flag(tech_pvt, TFLAG_IO); tech_pvt->profile->inuse--; switch_mutex_unlock(tech_pvt->profile->flag_mutex); @@ -656,6 +657,10 @@ static switch_status_t sofia_read_frame(switch_core_session_t *session, switch_f tech_pvt->read_frame.datalen = 0; switch_set_flag_locked(tech_pvt, TFLAG_READING); + if (switch_test_flag(tech_pvt, TFLAG_HUP) || switch_test_flag(tech_pvt, TFLAG_BYE) || !tech_pvt->read_codec.implementation) { + return SWITCH_STATUS_FALSE; + } + if (switch_test_flag(tech_pvt, TFLAG_IO)) { switch_status_t status; @@ -665,7 +670,7 @@ static switch_status_t sofia_read_frame(switch_core_session_t *session, switch_f switch_assert(tech_pvt->rtp_session != NULL); tech_pvt->read_frame.datalen = 0; - + while (switch_test_flag(tech_pvt, TFLAG_IO) && tech_pvt->read_frame.datalen == 0) { tech_pvt->read_frame.flags = SFF_NONE; @@ -845,6 +850,10 @@ static switch_status_t sofia_write_frame(switch_core_session_t *session, switch_ return SWITCH_STATUS_SUCCESS; } + if (switch_test_flag(tech_pvt, TFLAG_BYE) || !tech_pvt->read_codec.implementation) { + return SWITCH_STATUS_FALSE; + } + switch_set_flag_locked(tech_pvt, TFLAG_WRITING); if (!switch_test_flag(frame, SFF_CNG) && !switch_test_flag(frame, SFF_PROXY_PACKET)) {