diff options
author | Schanzenbach, Martin <martin.schanzenbach@aisec.fraunhofer.de> | 2018-01-10 04:29:06 +0100 |
---|---|---|
committer | Schanzenbach, Martin <martin.schanzenbach@aisec.fraunhofer.de> | 2018-01-10 04:29:06 +0100 |
commit | 16f04cf4fb1a7b489b3672d19818ffd1fd8d57f1 (patch) | |
tree | ad5072542ecfe966caa3e1927e90e81b103c3d35 /src/rest | |
parent | 5e233bcb4b48593af84c551738369fe89bc77251 (diff) | |
download | gnunet-16f04cf4fb1a7b489b3672d19818ffd1fd8d57f1.tar.gz gnunet-16f04cf4fb1a7b489b3672d19818ffd1fd8d57f1.zip |
fix scheduler when add_select is called with 0 ready fds
Diffstat (limited to 'src/rest')
-rw-r--r-- | src/rest/gnunet-rest-server.c | 49 |
1 files changed, 37 insertions, 12 deletions
diff --git a/src/rest/gnunet-rest-server.c b/src/rest/gnunet-rest-server.c index 5b92c6c43..b08aee389 100644 --- a/src/rest/gnunet-rest-server.c +++ b/src/rest/gnunet-rest-server.c | |||
@@ -154,11 +154,14 @@ do_httpd (void *cls); | |||
154 | static void | 154 | static void |
155 | run_mhd_now () | 155 | run_mhd_now () |
156 | { | 156 | { |
157 | if (NULL != | 157 | if (NULL != httpd_task) |
158 | httpd_task) | 158 | { |
159 | GNUNET_SCHEDULER_cancel (httpd_task); | 159 | GNUNET_SCHEDULER_cancel (httpd_task); |
160 | httpd_task = NULL; | ||
161 | } | ||
160 | httpd_task = GNUNET_SCHEDULER_add_now (&do_httpd, | 162 | httpd_task = GNUNET_SCHEDULER_add_now (&do_httpd, |
161 | NULL); | 163 | NULL); |
164 | |||
162 | } | 165 | } |
163 | 166 | ||
164 | /** | 167 | /** |
@@ -410,7 +413,18 @@ kill_httpd () | |||
410 | GNUNET_SCHEDULER_cancel (ltask6); | 413 | GNUNET_SCHEDULER_cancel (ltask6); |
411 | ltask6 = NULL; | 414 | ltask6 = NULL; |
412 | } | 415 | } |
413 | } | 416 | |
417 | if (NULL != lsock4) | ||
418 | { | ||
419 | GNUNET_NETWORK_socket_close (lsock4); | ||
420 | lsock4 = NULL; | ||
421 | } | ||
422 | if (NULL != lsock6) | ||
423 | { | ||
424 | GNUNET_NETWORK_socket_close (lsock6); | ||
425 | lsock6 = NULL; | ||
426 | } | ||
427 | } | ||
414 | 428 | ||
415 | 429 | ||
416 | /** | 430 | /** |
@@ -460,7 +474,10 @@ schedule_httpd () | |||
460 | wws = NULL; | 474 | wws = NULL; |
461 | } | 475 | } |
462 | if (NULL != httpd_task) | 476 | if (NULL != httpd_task) |
477 | { | ||
463 | GNUNET_SCHEDULER_cancel (httpd_task); | 478 | GNUNET_SCHEDULER_cancel (httpd_task); |
479 | httpd_task = NULL; | ||
480 | } | ||
464 | if ( (MHD_YES == haveto) || | 481 | if ( (MHD_YES == haveto) || |
465 | (-1 != max)) | 482 | (-1 != max)) |
466 | { | 483 | { |
@@ -468,6 +485,7 @@ schedule_httpd () | |||
468 | GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT, | 485 | GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT, |
469 | tv, wrs, wws, | 486 | tv, wrs, wws, |
470 | &do_httpd, NULL); | 487 | &do_httpd, NULL); |
488 | |||
471 | } | 489 | } |
472 | if (NULL != wrs) | 490 | if (NULL != wrs) |
473 | GNUNET_NETWORK_fdset_destroy (wrs); | 491 | GNUNET_NETWORK_fdset_destroy (wrs); |
@@ -504,18 +522,23 @@ do_accept (void *cls) | |||
504 | const struct sockaddr *addr; | 522 | const struct sockaddr *addr; |
505 | socklen_t len; | 523 | socklen_t len; |
506 | 524 | ||
525 | GNUNET_assert (NULL != lsock); | ||
507 | if (lsock == lsock4) | 526 | if (lsock == lsock4) |
508 | ltask4 = NULL; | 527 | { |
509 | else | ||
510 | ltask6 = NULL; | ||
511 | if (lsock == lsock4) | ||
512 | ltask4 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, | 528 | ltask4 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, |
513 | lsock, | 529 | lsock, |
514 | &do_accept, lsock); | 530 | &do_accept, lsock); |
515 | else | 531 | |
532 | } | ||
533 | else if (lsock == lsock6) | ||
534 | { | ||
516 | ltask6 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, | 535 | ltask6 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, |
517 | lsock, | 536 | lsock, |
518 | &do_accept, lsock); | 537 | &do_accept, lsock); |
538 | |||
539 | } | ||
540 | else | ||
541 | GNUNET_assert (0); | ||
519 | s = GNUNET_NETWORK_socket_accept (lsock, NULL, NULL); | 542 | s = GNUNET_NETWORK_socket_accept (lsock, NULL, NULL); |
520 | if (NULL == s) | 543 | if (NULL == s) |
521 | { | 544 | { |
@@ -720,6 +743,7 @@ run (void *cls, | |||
720 | { | 743 | { |
721 | ltask6 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, | 744 | ltask6 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, |
722 | lsock6, &do_accept, lsock6); | 745 | lsock6, &do_accept, lsock6); |
746 | |||
723 | } | 747 | } |
724 | } | 748 | } |
725 | lsock4 = bind_v4 (); | 749 | lsock4 = bind_v4 (); |
@@ -739,6 +763,7 @@ run (void *cls, | |||
739 | { | 763 | { |
740 | ltask4 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, | 764 | ltask4 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, |
741 | lsock4, &do_accept, lsock4); | 765 | lsock4, &do_accept, lsock4); |
766 | |||
742 | } | 767 | } |
743 | } | 768 | } |
744 | if ( (NULL == lsock4) && | 769 | if ( (NULL == lsock4) && |
@@ -785,10 +810,10 @@ main (int argc, char *const *argv) | |||
785 | { | 810 | { |
786 | struct GNUNET_GETOPT_CommandLineOption options[] = { | 811 | struct GNUNET_GETOPT_CommandLineOption options[] = { |
787 | GNUNET_GETOPT_option_ulong ('p', | 812 | GNUNET_GETOPT_option_ulong ('p', |
788 | "port", | 813 | "port", |
789 | "PORT", | 814 | "PORT", |
790 | gettext_noop ("listen on specified port (default: 7776)"), | 815 | gettext_noop ("listen on specified port (default: 7776)"), |
791 | &port), | 816 | &port), |
792 | GNUNET_GETOPT_OPTION_END | 817 | GNUNET_GETOPT_OPTION_END |
793 | }; | 818 | }; |
794 | static const char* err_page = | 819 | static const char* err_page = |