Browse code

Promptly close the netcmd_semaphore handle after use

If more than one openvpn processes are running and one aborts
without releasing the semaphore, subsequent processes fail to get
a lock for the semaphore. This may be avoided by not keeping open
handles to the semaphore so that Windows can destroy it when no
open handles remain.

See also: http://article.gmane.org/gmane.network.openvpn.devel/11913

Signed-off-by: Selva Nair <selva.nair@gmail.com>
Acked-by: Gert Doering <gert@greenie.muc.de>
Message-Id: <1465871689-13533-1-git-send-email-selva.nair@gmail.com>
URL: http://article.gmane.org/gmane.network.openvpn.devel/11919
Signed-off-by: Gert Doering <gert@greenie.muc.de>

Selva Nair authored on 2016/06/14 11:34:49
Showing 1 changed files
... ...
@@ -105,7 +105,6 @@ init_win32 (void)
105 105
     }
106 106
   window_title_clear (&window_title);
107 107
   win32_signal_clear (&win32_signal);
108
-  netcmd_semaphore_init ();
109 108
 }
110 109
 
111 110
 void
... ...
@@ -751,6 +750,10 @@ void
751 751
 netcmd_semaphore_lock (void)
752 752
 {
753 753
   const int timeout_seconds = 600;
754
+
755
+  if (!netcmd_semaphore.hand)
756
+    netcmd_semaphore_init ();
757
+
754 758
   if (!semaphore_lock (&netcmd_semaphore, timeout_seconds * 1000))
755 759
     msg (M_FATAL, "Cannot lock net command semaphore"); 
756 760
 }
... ...
@@ -759,6 +762,8 @@ void
759 759
 netcmd_semaphore_release (void)
760 760
 {
761 761
   semaphore_release (&netcmd_semaphore);
762
+  /* netcmd_semaphore has max count of 1 - safe to close after release */
763
+  semaphore_close (&netcmd_semaphore);
762 764
 }
763 765
 
764 766
 /*