diff options
author | Christian Grothoff <christian@grothoff.org> | 2015-03-07 10:33:47 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2015-03-07 10:33:47 +0000 |
commit | b80ca38067a55ae8588446ad47ecc7af65abefcc (patch) | |
tree | f58e674917026c236441584d2d4bed123edcbdc6 | |
parent | 1aebcd292bfe9863fe1609ed6c055e4db83cce9f (diff) | |
download | gnunet-b80ca38067a55ae8588446ad47ecc7af65abefcc.tar.gz gnunet-b80ca38067a55ae8588446ad47ecc7af65abefcc.zip |
trying to fix #3702 by removing session from session map earlier -- and adding additional check for messages being enqueued for destroyed sessions
-rw-r--r-- | src/transport/gnunet-service-transport_neighbours.c | 20 | ||||
-rw-r--r-- | src/transport/plugin_transport_udp.c | 37 |
2 files changed, 29 insertions, 28 deletions
diff --git a/src/transport/gnunet-service-transport_neighbours.c b/src/transport/gnunet-service-transport_neighbours.c index 9ce06d1b5..403eba3f6 100644 --- a/src/transport/gnunet-service-transport_neighbours.c +++ b/src/transport/gnunet-service-transport_neighbours.c | |||
@@ -1282,7 +1282,8 @@ transmit_send_continuation (void *cls, | |||
1282 | n->is_active = NULL; | 1282 | n->is_active = NULL; |
1283 | if (NULL != n->task) | 1283 | if (NULL != n->task) |
1284 | GNUNET_SCHEDULER_cancel (n->task); | 1284 | GNUNET_SCHEDULER_cancel (n->task); |
1285 | n->task = GNUNET_SCHEDULER_add_now (&master_task, n); | 1285 | n->task = GNUNET_SCHEDULER_add_now (&master_task, |
1286 | n); | ||
1286 | } | 1287 | } |
1287 | if (bytes_in_send_queue < mq->message_buf_size) | 1288 | if (bytes_in_send_queue < mq->message_buf_size) |
1288 | { | 1289 | { |
@@ -1299,14 +1300,14 @@ transmit_send_continuation (void *cls, | |||
1299 | GNUNET_break (size_payload == mq->message_buf_size); | 1300 | GNUNET_break (size_payload == mq->message_buf_size); |
1300 | bytes_in_send_queue -= mq->message_buf_size; | 1301 | bytes_in_send_queue -= mq->message_buf_size; |
1301 | GNUNET_STATISTICS_set (GST_stats, | 1302 | GNUNET_STATISTICS_set (GST_stats, |
1302 | gettext_noop | 1303 | gettext_noop ("# bytes in message queue for other peers"), |
1303 | ("# bytes in message queue for other peers"), | 1304 | bytes_in_send_queue, |
1304 | bytes_in_send_queue, GNUNET_NO); | 1305 | GNUNET_NO); |
1305 | if (GNUNET_OK == success) | 1306 | if (GNUNET_OK == success) |
1306 | GNUNET_STATISTICS_update (GST_stats, | 1307 | GNUNET_STATISTICS_update (GST_stats, |
1307 | gettext_noop | 1308 | gettext_noop ("# messages transmitted to other peers"), |
1308 | ("# messages transmitted to other peers"), | 1309 | 1, |
1309 | 1, GNUNET_NO); | 1310 | GNUNET_NO); |
1310 | else | 1311 | else |
1311 | GNUNET_STATISTICS_update (GST_stats, | 1312 | GNUNET_STATISTICS_update (GST_stats, |
1312 | gettext_noop | 1313 | gettext_noop |
@@ -1319,7 +1320,10 @@ transmit_send_continuation (void *cls, | |||
1319 | mq->message_buf_size, | 1320 | mq->message_buf_size, |
1320 | (success == GNUNET_OK) ? "success" : "FAILURE"); | 1321 | (success == GNUNET_OK) ? "success" : "FAILURE"); |
1321 | if (NULL != mq->cont) | 1322 | if (NULL != mq->cont) |
1322 | mq->cont (mq->cont_cls, success, size_payload, physical); | 1323 | mq->cont (mq->cont_cls, |
1324 | success, | ||
1325 | size_payload, | ||
1326 | physical); | ||
1323 | GNUNET_free (mq); | 1327 | GNUNET_free (mq); |
1324 | } | 1328 | } |
1325 | 1329 | ||
diff --git a/src/transport/plugin_transport_udp.c b/src/transport/plugin_transport_udp.c index c5542d200..9c9db06ae 100644 --- a/src/transport/plugin_transport_udp.c +++ b/src/transport/plugin_transport_udp.c | |||
@@ -1456,6 +1456,11 @@ enqueue (struct Plugin *plugin, | |||
1456 | { | 1456 | { |
1457 | struct Session *session = udpw->session; | 1457 | struct Session *session = udpw->session; |
1458 | 1458 | ||
1459 | if (GNUNET_YES == session->in_destroy) | ||
1460 | { | ||
1461 | GNUNET_break (0); | ||
1462 | return; | ||
1463 | } | ||
1459 | if (plugin->bytes_in_buffer + udpw->msg_size > INT64_MAX) | 1464 | if (plugin->bytes_in_buffer + udpw->msg_size > INT64_MAX) |
1460 | { | 1465 | { |
1461 | GNUNET_break (0); | 1466 | GNUNET_break (0); |
@@ -2174,7 +2179,10 @@ udp_disconnect_session (void *cls, | |||
2174 | fragmented_message_done (s->frag_ctx, | 2179 | fragmented_message_done (s->frag_ctx, |
2175 | GNUNET_SYSERR); | 2180 | GNUNET_SYSERR); |
2176 | } | 2181 | } |
2177 | 2182 | GNUNET_assert (GNUNET_YES == | |
2183 | GNUNET_CONTAINER_multipeermap_remove (plugin->sessions, | ||
2184 | &s->target, | ||
2185 | s)); | ||
2178 | frc.rc = NULL; | 2186 | frc.rc = NULL; |
2179 | frc.udp_addr = s->address->address; | 2187 | frc.udp_addr = s->address->address; |
2180 | frc.udp_addr_len = s->address->address_length; | 2188 | frc.udp_addr_len = s->address->address_length; |
@@ -2193,6 +2201,7 @@ udp_disconnect_session (void *cls, | |||
2193 | GNUNET_free (d_ctx); | 2201 | GNUNET_free (d_ctx); |
2194 | } | 2202 | } |
2195 | } | 2203 | } |
2204 | s->in_destroy = GNUNET_YES; | ||
2196 | next = plugin->ipv4_queue_head; | 2205 | next = plugin->ipv4_queue_head; |
2197 | while (NULL != (udpw = next)) | 2206 | while (NULL != (udpw = next)) |
2198 | { | 2207 | { |
@@ -2221,13 +2230,6 @@ udp_disconnect_session (void *cls, | |||
2221 | GNUNET_free (udpw); | 2230 | GNUNET_free (udpw); |
2222 | } | 2231 | } |
2223 | } | 2232 | } |
2224 | notify_session_monitor (s->plugin, | ||
2225 | s, | ||
2226 | GNUNET_TRANSPORT_SS_DONE); | ||
2227 | plugin->env->session_end (plugin->env->cls, | ||
2228 | s->address, | ||
2229 | s); | ||
2230 | |||
2231 | if ( (NULL != s->frag_ctx) && | 2233 | if ( (NULL != s->frag_ctx) && |
2232 | (NULL != s->frag_ctx->cont) ) | 2234 | (NULL != s->frag_ctx->cont) ) |
2233 | { | 2235 | { |
@@ -2242,23 +2244,18 @@ udp_disconnect_session (void *cls, | |||
2242 | s->frag_ctx->payload_size, | 2244 | s->frag_ctx->payload_size, |
2243 | s->frag_ctx->on_wire_size); | 2245 | s->frag_ctx->on_wire_size); |
2244 | } | 2246 | } |
2245 | 2247 | notify_session_monitor (s->plugin, | |
2246 | GNUNET_assert (GNUNET_YES == | 2248 | s, |
2247 | GNUNET_CONTAINER_multipeermap_remove (plugin->sessions, | 2249 | GNUNET_TRANSPORT_SS_DONE); |
2248 | &s->target, | 2250 | plugin->env->session_end (plugin->env->cls, |
2249 | s)); | 2251 | s->address, |
2252 | s); | ||
2250 | GNUNET_STATISTICS_set (plugin->env->stats, | 2253 | GNUNET_STATISTICS_set (plugin->env->stats, |
2251 | "# UDP sessions active", | 2254 | "# UDP sessions active", |
2252 | GNUNET_CONTAINER_multipeermap_size (plugin->sessions), | 2255 | GNUNET_CONTAINER_multipeermap_size (plugin->sessions), |
2253 | GNUNET_NO); | 2256 | GNUNET_NO); |
2254 | if (s->rc > 0) | 2257 | if (0 == s->rc) |
2255 | { | ||
2256 | s->in_destroy = GNUNET_YES; | ||
2257 | } | ||
2258 | else | ||
2259 | { | ||
2260 | free_session (s); | 2258 | free_session (s); |
2261 | } | ||
2262 | return GNUNET_OK; | 2259 | return GNUNET_OK; |
2263 | } | 2260 | } |
2264 | 2261 | ||