summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorirungentoo <irungentoo@gmail.com>2014-12-11 13:54:55 -0500
committerirungentoo <irungentoo@gmail.com>2014-12-11 13:54:55 -0500
commitd7f57132772e69c2f9f3596c6525d9d37393f9be (patch)
treeb625a1395d2ea97f1ab87d06340a203d9e14832f
parent4eeeb8e9abb4de9522f46bc8f2c52fb34653776f (diff)
Fixed crash when connection was killed during the packet callback.
-rw-r--r--toxcore/friend_connection.c10
-rw-r--r--toxcore/net_crypto.c9
2 files changed, 18 insertions, 1 deletions
diff --git a/toxcore/friend_connection.c b/toxcore/friend_connection.c
index aaffe02f..894ba61a 100644
--- a/toxcore/friend_connection.c
+++ b/toxcore/friend_connection.c
@@ -274,6 +274,11 @@ static int handle_packet(void *object, int number, uint8_t *data, uint16_t lengt
274 if (friend_con->callbacks[i].data_callback) 274 if (friend_con->callbacks[i].data_callback)
275 friend_con->callbacks[i].data_callback(friend_con->callbacks[i].data_callback_object, 275 friend_con->callbacks[i].data_callback(friend_con->callbacks[i].data_callback_object,
276 friend_con->callbacks[i].data_callback_id, data, length); 276 friend_con->callbacks[i].data_callback_id, data, length);
277
278 friend_con = get_conn(fr_c, number);
279
280 if (!friend_con)
281 return -1;
277 } 282 }
278 283
279 return 0; 284 return 0;
@@ -296,6 +301,11 @@ static int handle_lossy_packet(void *object, int number, const uint8_t *data, ui
296 if (friend_con->callbacks[i].lossy_data_callback) 301 if (friend_con->callbacks[i].lossy_data_callback)
297 friend_con->callbacks[i].lossy_data_callback(friend_con->callbacks[i].lossy_data_callback_object, 302 friend_con->callbacks[i].lossy_data_callback(friend_con->callbacks[i].lossy_data_callback_object,
298 friend_con->callbacks[i].lossy_data_callback_id, data, length); 303 friend_con->callbacks[i].lossy_data_callback_id, data, length);
304
305 friend_con = get_conn(fr_c, number);
306
307 if (!friend_con)
308 return -1;
299 } 309 }
300 310
301 return 0; 311 return 0;
diff --git a/toxcore/net_crypto.c b/toxcore/net_crypto.c
index bcb1dc6d..be2f967d 100644
--- a/toxcore/net_crypto.c
+++ b/toxcore/net_crypto.c
@@ -1180,6 +1180,12 @@ static int handle_data_packet_helper(const Net_Crypto *c, int crypt_connection_i
1180 if (conn->connection_data_callback) 1180 if (conn->connection_data_callback)
1181 conn->connection_data_callback(conn->connection_data_callback_object, conn->connection_data_callback_id, dt.data, 1181 conn->connection_data_callback(conn->connection_data_callback_object, conn->connection_data_callback_id, dt.data,
1182 dt.length); 1182 dt.length);
1183
1184 /* conn might get killed in callback. */
1185 conn = get_crypto_connection(c, crypt_connection_id);
1186
1187 if (conn == 0)
1188 return -1;
1183 } 1189 }
1184 1190
1185 /* Packet counter. */ 1191 /* Packet counter. */
@@ -1187,11 +1193,12 @@ static int handle_data_packet_helper(const Net_Crypto *c, int crypt_connection_i
1187 } else if (real_data[0] >= PACKET_ID_LOSSY_RANGE_START && 1193 } else if (real_data[0] >= PACKET_ID_LOSSY_RANGE_START &&
1188 real_data[0] < (PACKET_ID_LOSSY_RANGE_START + PACKET_ID_LOSSY_RANGE_SIZE)) { 1194 real_data[0] < (PACKET_ID_LOSSY_RANGE_START + PACKET_ID_LOSSY_RANGE_SIZE)) {
1189 1195
1196 set_buffer_end(&conn->recv_array, num);
1197
1190 if (conn->connection_lossy_data_callback) 1198 if (conn->connection_lossy_data_callback)
1191 conn->connection_lossy_data_callback(conn->connection_lossy_data_callback_object, 1199 conn->connection_lossy_data_callback(conn->connection_lossy_data_callback_object,
1192 conn->connection_lossy_data_callback_id, real_data, real_length); 1200 conn->connection_lossy_data_callback_id, real_data, real_length);
1193 1201
1194 set_buffer_end(&conn->recv_array, num);
1195 } else { 1202 } else {
1196 return -1; 1203 return -1;
1197 } 1204 }