aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2015-03-07 10:33:47 +0000
committerChristian Grothoff <christian@grothoff.org>2015-03-07 10:33:47 +0000
commitb80ca38067a55ae8588446ad47ecc7af65abefcc (patch)
treef58e674917026c236441584d2d4bed123edcbdc6 /src
parent1aebcd292bfe9863fe1609ed6c055e4db83cce9f (diff)
downloadgnunet-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
Diffstat (limited to 'src')
-rw-r--r--src/transport/gnunet-service-transport_neighbours.c20
-rw-r--r--src/transport/plugin_transport_udp.c37
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