diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2011-11-14 12:05:56 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2011-11-14 12:05:56 +0000 |
commit | 319ec3f43630665e878c3e33bef9596bae0ba87b (patch) | |
tree | 8807da3aede3a304a3c33ea3a66fb68e9da39118 /src | |
parent | d9d6b4eac102fd3f326f6adccee2857e880d61ee (diff) | |
download | gnunet-319ec3f43630665e878c3e33bef9596bae0ba87b.tar.gz gnunet-319ec3f43630665e878c3e33bef9596bae0ba87b.zip |
fixing memory leak #1895
Diffstat (limited to 'src')
-rw-r--r-- | src/transport/plugin_transport_http.c | 44 | ||||
-rw-r--r-- | src/transport/plugin_transport_http_server.c | 55 |
2 files changed, 85 insertions, 14 deletions
diff --git a/src/transport/plugin_transport_http.c b/src/transport/plugin_transport_http.c index bb61b27e4..571b0db49 100644 --- a/src/transport/plugin_transport_http.c +++ b/src/transport/plugin_transport_http.c | |||
@@ -585,22 +585,25 @@ http_plugin_send (void *cls, const struct GNUNET_PeerIdentity *target, | |||
585 | { | 585 | { |
586 | #if DEBUG_HTTP | 586 | #if DEBUG_HTTP |
587 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, | 587 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, |
588 | "Using outbound client session to send to `%s'\n", | 588 | "Using outbound client session %p to send to `%s'\n", |
589 | s, | ||
589 | GNUNET_i2s (target)); | 590 | GNUNET_i2s (target)); |
590 | #endif | 591 | #endif |
592 | |||
591 | client_send (s, msg); | 593 | client_send (s, msg); |
592 | res = msgbuf_size; | 594 | res = msgbuf_size; |
593 | } | 595 | } |
594 | if (s->inbound == GNUNET_YES) | 596 | if (s->inbound == GNUNET_YES) |
595 | { | 597 | { |
596 | server_send (s, msg); | ||
597 | res = msgbuf_size; | ||
598 | #if DEBUG_HTTP | 598 | #if DEBUG_HTTP |
599 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, | 599 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, |
600 | "Using inbound server session to send to `%s'\n", | 600 | "Using inbound server %p session to send to `%s'\n", |
601 | s, | ||
601 | GNUNET_i2s (target)); | 602 | GNUNET_i2s (target)); |
602 | #endif | 603 | #endif |
603 | 604 | ||
605 | server_send (s, msg); | ||
606 | res = msgbuf_size; | ||
604 | } | 607 | } |
605 | return res; | 608 | return res; |
606 | } | 609 | } |
@@ -634,6 +637,22 @@ http_plugin_disconnect (void *cls, const struct GNUNET_PeerIdentity *target) | |||
634 | else | 637 | else |
635 | GNUNET_assert (GNUNET_OK == server_disconnect (s)); | 638 | GNUNET_assert (GNUNET_OK == server_disconnect (s)); |
636 | GNUNET_CONTAINER_DLL_remove (plugin->head, plugin->tail, s); | 639 | GNUNET_CONTAINER_DLL_remove (plugin->head, plugin->tail, s); |
640 | |||
641 | struct HTTP_Message * msg = s->msg_head; | ||
642 | struct HTTP_Message * tmp = s->msg_head; | ||
643 | while (msg != NULL) | ||
644 | { | ||
645 | tmp = msg->next; | ||
646 | |||
647 | GNUNET_CONTAINER_DLL_remove(s->msg_head,s->msg_tail, msg); | ||
648 | if (msg->transmit_cont != NULL) | ||
649 | { | ||
650 | msg->transmit_cont(msg->transmit_cont_cls, target, GNUNET_SYSERR); | ||
651 | } | ||
652 | GNUNET_free (msg); | ||
653 | msg = tmp; | ||
654 | } | ||
655 | |||
637 | delete_session (s); | 656 | delete_session (s); |
638 | } | 657 | } |
639 | s = next; | 658 | s = next; |
@@ -1387,8 +1406,23 @@ LIBGNUNET_PLUGIN_TRANSPORT_DONE (void *cls) | |||
1387 | while (s != NULL) | 1406 | while (s != NULL) |
1388 | { | 1407 | { |
1389 | struct Session *t = s->next; | 1408 | struct Session *t = s->next; |
1390 | |||
1391 | GNUNET_CONTAINER_DLL_remove (plugin->head, plugin->tail, s); | 1409 | GNUNET_CONTAINER_DLL_remove (plugin->head, plugin->tail, s); |
1410 | |||
1411 | struct HTTP_Message * msg = s->msg_head; | ||
1412 | struct HTTP_Message * tmp = s->msg_head; | ||
1413 | while (msg != NULL) | ||
1414 | { | ||
1415 | tmp = msg->next; | ||
1416 | |||
1417 | GNUNET_CONTAINER_DLL_remove(s->msg_head,s->msg_tail, msg); | ||
1418 | if (msg->transmit_cont != NULL) | ||
1419 | { | ||
1420 | msg->transmit_cont(msg->transmit_cont_cls, &s->target, GNUNET_SYSERR); | ||
1421 | } | ||
1422 | GNUNET_free (msg); | ||
1423 | msg = tmp; | ||
1424 | } | ||
1425 | |||
1392 | delete_session (s); | 1426 | delete_session (s); |
1393 | s = t; | 1427 | s = t; |
1394 | } | 1428 | } |
diff --git a/src/transport/plugin_transport_http_server.c b/src/transport/plugin_transport_http_server.c index 48c8739d5..507cad216 100644 --- a/src/transport/plugin_transport_http_server.c +++ b/src/transport/plugin_transport_http_server.c | |||
@@ -311,7 +311,10 @@ static ssize_t | |||
311 | server_send_callback (void *cls, uint64_t pos, char *buf, size_t max) | 311 | server_send_callback (void *cls, uint64_t pos, char *buf, size_t max) |
312 | { | 312 | { |
313 | struct Session *s = cls; | 313 | struct Session *s = cls; |
314 | 314 | #if VERBOSE_SERVER | |
315 | GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, s->plugin->name, | ||
316 | "Server: %X can sent maximum %u \n", s, max); | ||
317 | #endif | ||
315 | struct HTTP_Message *msg; | 318 | struct HTTP_Message *msg; |
316 | int bytes_read = 0; | 319 | int bytes_read = 0; |
317 | 320 | ||
@@ -345,8 +348,7 @@ server_send_callback (void *cls, uint64_t pos, char *buf, size_t max) | |||
345 | 348 | ||
346 | #if VERBOSE_CLIENT | 349 | #if VERBOSE_CLIENT |
347 | struct Plugin *plugin = s->plugin; | 350 | struct Plugin *plugin = s->plugin; |
348 | 351 | GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, plugin->name, | |
349 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name, | ||
350 | "Server: %X: sent %u bytes\n", s, bytes_read); | 352 | "Server: %X: sent %u bytes\n", s, bytes_read); |
351 | #endif | 353 | #endif |
352 | return bytes_read; | 354 | return bytes_read; |
@@ -852,8 +854,6 @@ server_disconnect (struct Session *s) | |||
852 | } | 854 | } |
853 | t = t->next; | 855 | t = t->next; |
854 | } | 856 | } |
855 | |||
856 | |||
857 | return GNUNET_OK; | 857 | return GNUNET_OK; |
858 | } | 858 | } |
859 | 859 | ||
@@ -884,7 +884,10 @@ server_v4_run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
884 | 884 | ||
885 | if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) | 885 | if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) |
886 | return; | 886 | return; |
887 | 887 | #if VERBOSE_SERVER | |
888 | GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, plugin->name, | ||
889 | "Running IPv6 server\n"); | ||
890 | #endif | ||
888 | GNUNET_assert (MHD_YES == MHD_run (plugin->server_v4)); | 891 | GNUNET_assert (MHD_YES == MHD_run (plugin->server_v4)); |
889 | if (plugin->server_v4 != NULL) | 892 | if (plugin->server_v4 != NULL) |
890 | plugin->server_v4_task = | 893 | plugin->server_v4_task = |
@@ -909,7 +912,10 @@ server_v6_run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
909 | 912 | ||
910 | if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) | 913 | if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) |
911 | return; | 914 | return; |
912 | 915 | #if VERBOSE_SERVER | |
916 | GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, plugin->name, | ||
917 | "Running IPv6 server\n"); | ||
918 | #endif | ||
913 | GNUNET_assert (MHD_YES == MHD_run (plugin->server_v6)); | 919 | GNUNET_assert (MHD_YES == MHD_run (plugin->server_v6)); |
914 | if (plugin->server_v6 != NULL) | 920 | if (plugin->server_v6 != NULL) |
915 | plugin->server_v6_task = | 921 | plugin->server_v6_task = |
@@ -972,6 +978,7 @@ server_schedule (struct Plugin *plugin, struct MHD_Daemon *daemon_handle, | |||
972 | GNUNET_NETWORK_fdset_copy_native (wrs, &rs, max + 1); | 978 | GNUNET_NETWORK_fdset_copy_native (wrs, &rs, max + 1); |
973 | GNUNET_NETWORK_fdset_copy_native (wws, &ws, max + 1); | 979 | GNUNET_NETWORK_fdset_copy_native (wws, &ws, max + 1); |
974 | GNUNET_NETWORK_fdset_copy_native (wes, &es, max + 1); | 980 | GNUNET_NETWORK_fdset_copy_native (wes, &es, max + 1); |
981 | |||
975 | if (daemon_handle == plugin->server_v4) | 982 | if (daemon_handle == plugin->server_v4) |
976 | { | 983 | { |
977 | if (plugin->server_v4_task != GNUNET_SCHEDULER_NO_TASK) | 984 | if (plugin->server_v4_task != GNUNET_SCHEDULER_NO_TASK) |
@@ -979,7 +986,10 @@ server_schedule (struct Plugin *plugin, struct MHD_Daemon *daemon_handle, | |||
979 | GNUNET_SCHEDULER_cancel (plugin->server_v4_task); | 986 | GNUNET_SCHEDULER_cancel (plugin->server_v4_task); |
980 | plugin->server_v4_task = GNUNET_SCHEDULER_NO_TASK; | 987 | plugin->server_v4_task = GNUNET_SCHEDULER_NO_TASK; |
981 | } | 988 | } |
982 | 989 | #if VERBOSE_SERVER | |
990 | GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, plugin->name, | ||
991 | "Scheduling IPv4 server task in %llu ms\n", tv); | ||
992 | #endif | ||
983 | ret = | 993 | ret = |
984 | GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT, | 994 | GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT, |
985 | GNUNET_SCHEDULER_NO_TASK, tv, wrs, wws, | 995 | GNUNET_SCHEDULER_NO_TASK, tv, wrs, wws, |
@@ -992,7 +1002,10 @@ server_schedule (struct Plugin *plugin, struct MHD_Daemon *daemon_handle, | |||
992 | GNUNET_SCHEDULER_cancel (plugin->server_v6_task); | 1002 | GNUNET_SCHEDULER_cancel (plugin->server_v6_task); |
993 | plugin->server_v6_task = GNUNET_SCHEDULER_NO_TASK; | 1003 | plugin->server_v6_task = GNUNET_SCHEDULER_NO_TASK; |
994 | } | 1004 | } |
995 | 1005 | #if VERBOSE_SERVER | |
1006 | GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, plugin->name, | ||
1007 | "Scheduling IPv6 server task in %llu ms\n", tv); | ||
1008 | #endif | ||
996 | ret = | 1009 | ret = |
997 | GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT, | 1010 | GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT, |
998 | GNUNET_SCHEDULER_NO_TASK, tv, wrs, wws, | 1011 | GNUNET_SCHEDULER_NO_TASK, tv, wrs, wws, |
@@ -1139,6 +1152,11 @@ server_stop (struct Plugin *plugin) | |||
1139 | struct Session *s = NULL; | 1152 | struct Session *s = NULL; |
1140 | struct Session *t = NULL; | 1153 | struct Session *t = NULL; |
1141 | 1154 | ||
1155 | #if VERBOSE_SERVER | ||
1156 | GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, plugin->name, | ||
1157 | "server_stop\n"); | ||
1158 | #endif | ||
1159 | |||
1142 | struct MHD_Daemon *server_v4_tmp = plugin->server_v4; | 1160 | struct MHD_Daemon *server_v4_tmp = plugin->server_v4; |
1143 | 1161 | ||
1144 | plugin->server_v4 = NULL; | 1162 | plugin->server_v4 = NULL; |
@@ -1171,7 +1189,26 @@ server_stop (struct Plugin *plugin) | |||
1171 | s = plugin->server_semi_head; | 1189 | s = plugin->server_semi_head; |
1172 | while (s != NULL) | 1190 | while (s != NULL) |
1173 | { | 1191 | { |
1192 | #if VERBOSE_SERVER | ||
1193 | GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, plugin->name, | ||
1194 | "Deleting semi-sessions %p\n", s); | ||
1195 | #endif | ||
1174 | t = s->next; | 1196 | t = s->next; |
1197 | struct HTTP_Message * msg = s->msg_head; | ||
1198 | struct HTTP_Message * tmp = s->msg_head; | ||
1199 | while (msg != NULL) | ||
1200 | { | ||
1201 | tmp = msg->next; | ||
1202 | |||
1203 | GNUNET_CONTAINER_DLL_remove(s->msg_head,s->msg_tail, msg); | ||
1204 | if (msg->transmit_cont != NULL) | ||
1205 | { | ||
1206 | msg->transmit_cont(msg->transmit_cont_cls, &s->target, GNUNET_SYSERR); | ||
1207 | } | ||
1208 | GNUNET_free (msg); | ||
1209 | msg = tmp; | ||
1210 | } | ||
1211 | |||
1175 | delete_session (s); | 1212 | delete_session (s); |
1176 | s = t; | 1213 | s = t; |
1177 | } | 1214 | } |