]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
fix potential race
authorAnthony Minessale <anthony.minessale@gmail.com>
Tue, 16 Dec 2008 20:59:00 +0000 (20:59 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Tue, 16 Dec 2008 20:59:00 +0000 (20:59 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@10828 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/endpoints/mod_sofia/mod_sofia.c

index 86f4d558c10109aecf26fee195be4a71135444f3..b3575dced95b3bc5cb5f4fa87b0f56a9fad5599c 100644 (file)
@@ -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)) {