]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
Fixed an issue in the Management Interface that could cause
authorjames <james@e7ae566f-a301-0410-adde-c780ea21d3b5>
Fri, 26 Feb 2010 10:26:45 +0000 (10:26 +0000)
committerjames <james@e7ae566f-a301-0410-adde-c780ea21d3b5>
Fri, 26 Feb 2010 10:26:45 +0000 (10:26 +0000)
a process hang with 100% CPU utilization in --management-client
mode if the management interface client disconnected at the
point where credentials are queried.

git-svn-id: http://svn.openvpn.net/projects/openvpn/branches/BETA21/openvpn@5458 e7ae566f-a301-0410-adde-c780ea21d3b5

manage.c

index 0f72f64051961964deaaeac8f1e9632be2251c86..f75aedd9b385ff0bbcb163a64564564b2be32ee6 100644 (file)
--- a/manage.c
+++ b/manage.c
@@ -1541,17 +1541,18 @@ man_reset_client_socket (struct management *man, const bool exiting)
 {
   if (socket_defined (man->connection.sd_cli))
     {
-      msg (D_MANAGEMENT, "MANAGEMENT: Client disconnected");
 #ifdef WIN32
       man_stop_ne32 (man);
 #endif
       man_close_socket (man, man->connection.sd_cli);
       man->connection.sd_cli = SOCKET_UNDEFINED;
+      man->connection.state = MS_INITIAL;
       command_line_reset (man->connection.in);
       buffer_list_reset (man->connection.out);
 #ifdef MANAGEMENT_DEF_AUTH
       in_extra_reset (&man->connection, false);
 #endif
+      msg (D_MANAGEMENT, "MANAGEMENT: Client disconnected");
     }
   if (!exiting)
     {
@@ -2511,11 +2512,13 @@ man_output_standalone (struct management *man, volatile int *signal_received)
 static int
 man_standalone_event_loop (struct management *man, volatile int *signal_received, const time_t expire)
 {
-  int status;
-  ASSERT (man_standalone_ok (man));
-  status = man_block (man, signal_received, expire);
-  if (status > 0)
-    management_io (man);
+  int status = -1;
+  if (man_standalone_ok (man))
+    {
+      status = man_block (man, signal_received, expire);
+      if (status > 0)
+       management_io (man);
+    }
   return status;
 }
 
@@ -2573,6 +2576,8 @@ management_event_loop_n_seconds (struct management *man, int sec)
       while (true)
        {
          man_standalone_event_loop (man, &signal_received, expire);
+         if (!signal_received)
+           man_check_for_signals (&signal_received);
          if (signal_received)
            return;
        }
@@ -2662,6 +2667,8 @@ management_query_user_pass (struct management *man,
          do
            {
              man_standalone_event_loop (man, &signal_received, 0);
+             if (!signal_received)
+               man_check_for_signals (&signal_received);
              if (signal_received)
                {
                  ret = false;
@@ -2742,6 +2749,8 @@ management_hold (struct management *man)
          do
            {
              man_standalone_event_loop (man, &signal_received, 0);
+             if (!signal_received)
+               man_check_for_signals (&signal_received);
              if (signal_received)
                break;
            } while (!man->persist.hold_release);