summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormannol <eniz_vukovic@hotmail.com>2015-08-09 11:57:39 +0200
committermannol <eniz_vukovic@hotmail.com>2015-08-09 11:57:39 +0200
commit12d3f9396b53aa71f41cd16703cdeb7befd99a4a (patch)
tree1c470986f0d63260280d9117565d45b510f6fd33
parent6ab4308581f6b06b2a4516614b4f1e2f9b3667a9 (diff)
Fix possible double free
-rw-r--r--toxav/toxav.c28
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
114bool audio_bit_rate_invalid(uint32_t bit_rate); 114bool audio_bit_rate_invalid(uint32_t bit_rate);
115bool video_bit_rate_invalid(uint32_t bit_rate); 115bool video_bit_rate_invalid(uint32_t bit_rate);
116bool invoke_call_state(ToxAV* av, uint32_t friend_number, uint32_t state); 116bool invoke_call_state_callback(ToxAV* av, uint32_t friend_number, uint32_t state);
117ToxAVCall* call_new(ToxAV* av, uint32_t friend_number, TOXAV_ERR_CALL* error); 117ToxAVCall* call_new(ToxAV* av, uint32_t friend_number, TOXAV_ERR_CALL* error);
118ToxAVCall* call_get(ToxAV* av, uint32_t friend_number); 118ToxAVCall* call_get(ToxAV* av, uint32_t friend_number);
119ToxAVCall* call_remove(ToxAVCall* call); 119ToxAVCall* 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
1181bool invoke_call_state(ToxAV* av, uint32_t friend_number, uint32_t state) 1185bool 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)