summaryrefslogtreecommitdiff
path: root/src/rest
diff options
context:
space:
mode:
authorSchanzenbach, Martin <martin.schanzenbach@aisec.fraunhofer.de>2018-01-10 04:29:06 +0100
committerSchanzenbach, Martin <martin.schanzenbach@aisec.fraunhofer.de>2018-01-10 04:29:06 +0100
commit16f04cf4fb1a7b489b3672d19818ffd1fd8d57f1 (patch)
treead5072542ecfe966caa3e1927e90e81b103c3d35 /src/rest
parent5e233bcb4b48593af84c551738369fe89bc77251 (diff)
downloadgnunet-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.c49
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);
154static void 154static void
155run_mhd_now () 155run_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 =