diff options
author | mannol <eniz_vukovic@hotmail.com> | 2015-08-09 11:57:39 +0200 |
---|---|---|
committer | mannol <eniz_vukovic@hotmail.com> | 2015-08-09 11:57:39 +0200 |
commit | 12d3f9396b53aa71f41cd16703cdeb7befd99a4a (patch) | |
tree | 1c470986f0d63260280d9117565d45b510f6fd33 | |
parent | 6ab4308581f6b06b2a4516614b4f1e2f9b3667a9 (diff) |
Fix possible double free
-rw-r--r-- | toxav/toxav.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/toxav/toxav.c b/toxav/toxav.c index aaad2f14..881ade1f 100644 --- a/toxav/toxav.c +++ b/toxav/toxav.c | |||
@@ -113,7 +113,7 @@ int callback_capabilites(void* toxav_inst, MSICall* call); | |||
113 | 113 | ||
114 | bool audio_bit_rate_invalid(uint32_t bit_rate); | 114 | bool audio_bit_rate_invalid(uint32_t bit_rate); |
115 | bool video_bit_rate_invalid(uint32_t bit_rate); | 115 | bool video_bit_rate_invalid(uint32_t bit_rate); |
116 | bool invoke_call_state(ToxAV* av, uint32_t friend_number, uint32_t state); | 116 | bool invoke_call_state_callback(ToxAV* av, uint32_t friend_number, uint32_t state); |
117 | ToxAVCall* call_new(ToxAV* av, uint32_t friend_number, TOXAV_ERR_CALL* error); | 117 | ToxAVCall* call_new(ToxAV* av, uint32_t friend_number, TOXAV_ERR_CALL* error); |
118 | ToxAVCall* call_get(ToxAV* av, uint32_t friend_number); | 118 | ToxAVCall* call_get(ToxAV* av, uint32_t friend_number); |
119 | ToxAVCall* call_remove(ToxAVCall* call); | 119 | ToxAVCall* call_remove(ToxAVCall* call); |
@@ -1104,7 +1104,7 @@ int callback_start(void* toxav_inst, MSICall* call) | |||
1104 | return -1; | 1104 | return -1; |
1105 | } | 1105 | } |
1106 | 1106 | ||
1107 | if (!invoke_call_state(toxav, call->friend_number, call->peer_capabilities)) { | 1107 | if (!invoke_call_state_callback(toxav, call->friend_number, call->peer_capabilities)) { |
1108 | callback_error(toxav_inst, call); | 1108 | callback_error(toxav_inst, call); |
1109 | pthread_mutex_unlock(toxav->mutex); | 1109 | pthread_mutex_unlock(toxav->mutex); |
1110 | return -1; | 1110 | return -1; |
@@ -1119,10 +1119,12 @@ int callback_end(void* toxav_inst, MSICall* call) | |||
1119 | ToxAV* toxav = toxav_inst; | 1119 | ToxAV* toxav = toxav_inst; |
1120 | pthread_mutex_lock(toxav->mutex); | 1120 | pthread_mutex_lock(toxav->mutex); |
1121 | 1121 | ||
1122 | invoke_call_state(toxav, call->friend_number, TOXAV_FRIEND_CALL_STATE_FINISHED); | 1122 | invoke_call_state_callback(toxav, call->friend_number, TOXAV_FRIEND_CALL_STATE_FINISHED); |
1123 | 1123 | ||
1124 | call_kill_transmission(call->av_call); | 1124 | if (call->av_call) { |
1125 | call_remove(call->av_call); | 1125 | call_kill_transmission(call->av_call); |
1126 | call_remove(call->av_call); | ||
1127 | } | ||
1126 | 1128 | ||
1127 | pthread_mutex_unlock(toxav->mutex); | 1129 | pthread_mutex_unlock(toxav->mutex); |
1128 | return 0; | 1130 | return 0; |
@@ -1133,10 +1135,12 @@ int callback_error(void* toxav_inst, MSICall* call) | |||
1133 | ToxAV* toxav = toxav_inst; | 1135 | ToxAV* toxav = toxav_inst; |
1134 | pthread_mutex_lock(toxav->mutex); | 1136 | pthread_mutex_lock(toxav->mutex); |
1135 | 1137 | ||
1136 | invoke_call_state(toxav, call->friend_number, TOXAV_FRIEND_CALL_STATE_ERROR); | 1138 | invoke_call_state_callback(toxav, call->friend_number, TOXAV_FRIEND_CALL_STATE_ERROR); |
1137 | 1139 | ||
1138 | call_kill_transmission(call->av_call); | 1140 | if (call->av_call) { |
1139 | call_remove(call->av_call); | 1141 | call_kill_transmission(call->av_call); |
1142 | call_remove(call->av_call); | ||
1143 | } | ||
1140 | 1144 | ||
1141 | pthread_mutex_unlock(toxav->mutex); | 1145 | pthread_mutex_unlock(toxav->mutex); |
1142 | return 0; | 1146 | return 0; |
@@ -1157,7 +1161,7 @@ int callback_capabilites(void* toxav_inst, MSICall* call) | |||
1157 | else | 1161 | else |
1158 | rtp_stop_receiving(((ToxAVCall*)call->av_call)->video.first); | 1162 | rtp_stop_receiving(((ToxAVCall*)call->av_call)->video.first); |
1159 | 1163 | ||
1160 | invoke_call_state(toxav, call->friend_number, call->peer_capabilities); | 1164 | invoke_call_state_callback(toxav, call->friend_number, call->peer_capabilities); |
1161 | 1165 | ||
1162 | pthread_mutex_unlock(toxav->mutex); | 1166 | pthread_mutex_unlock(toxav->mutex); |
1163 | return 0; | 1167 | return 0; |
@@ -1178,7 +1182,7 @@ bool video_bit_rate_invalid(uint32_t bit_rate) | |||
1178 | return false; | 1182 | return false; |
1179 | } | 1183 | } |
1180 | 1184 | ||
1181 | bool invoke_call_state(ToxAV* av, uint32_t friend_number, uint32_t state) | 1185 | bool invoke_call_state_callback(ToxAV* av, uint32_t friend_number, uint32_t state) |
1182 | { | 1186 | { |
1183 | if (av->scb.first) | 1187 | if (av->scb.first) |
1184 | av->scb.first(av, friend_number, state, av->scb.second); | 1188 | av->scb.first(av, friend_number, state, av->scb.second); |
@@ -1288,6 +1292,10 @@ ToxAVCall* call_remove(ToxAVCall* call) | |||
1288 | ToxAVCall* prev = call->prev; | 1292 | ToxAVCall* prev = call->prev; |
1289 | ToxAVCall* next = call->next; | 1293 | ToxAVCall* next = call->next; |
1290 | 1294 | ||
1295 | /* Set av call in msi to NULL in order to know if call if ToxAVCall is | ||
1296 | * removed from the msi call. | ||
1297 | */ | ||
1298 | call->msi_call->av_call = NULL; | ||
1291 | free(call); | 1299 | free(call); |
1292 | 1300 | ||
1293 | if (prev) | 1301 | if (prev) |