aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Yonan <james@openvpn.net>2010-02-26 10:26:45 +0000
committerJames Yonan <james@openvpn.net>2010-02-26 10:26:45 +0000
commit3a37ffbe898b05d28a2eb52122e2a3ea43970690 (patch)
treefc6c95ceeca4b79bd74b463e50ffad44959fc02a
parentVersion 2.1.1b (diff)
downloadopenvpn-3a37ffbe898b05d28a2eb52122e2a3ea43970690.tar.xz
Fixed an issue in the Management Interface that could cause
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
-rw-r--r--manage.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/manage.c b/manage.c
index 0f72f64..f75aedd 100644
--- 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);