Fix race condition
authorGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Sun, 16 Oct 2011 05:59:22 +0000 (01:59 -0400)
committerGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Sun, 16 Oct 2011 05:59:22 +0000 (01:59 -0400)
Our synchronized Hashtable "set" method is not really locking...

mcs/class/System/System.Net/EndPointListener.cs

index 34fe18fe888efe3e89db5cd1e0096bec7a2d528e..8fb54a4c6c5b139176620bbda6ea5995424b7127 100644 (file)
@@ -65,7 +65,7 @@ namespace System.Net {
                        args.Completed += OnAccept;
                        sock.AcceptAsync (args);
                        prefixes = new Hashtable ();
-                       unregistered = Hashtable.Synchronized (new Hashtable ());
+                       unregistered = new Hashtable ();
                }
 
                void LoadCertificateAndKey (IPAddress addr, int port)
@@ -114,13 +114,17 @@ namespace System.Net {
                                return;
                        }
                        HttpConnection conn = new HttpConnection (accepted, epl, epl.secure, epl.cert, epl.key);
-                       epl.unregistered [conn] = conn;
+                       lock (epl.unregistered) {
+                               epl.unregistered [conn] = conn;
+                       }
                        conn.BeginReadRequest ();
                }
 
                internal void RemoveConnection (HttpConnection conn)
                {
-                       unregistered.Remove (conn);
+                       lock (unregistered) {
+                               unregistered.Remove (conn);
+                       }
                }
 
                public bool BindContext (HttpListenerContext context)
@@ -266,7 +270,7 @@ namespace System.Net {
                public void Close ()
                {
                        sock.Close ();
-                       lock (unregistered.SyncRoot) {
+                       lock (unregistered) {
                                foreach (HttpConnection c in unregistered.Keys)
                                        c.Close (true);
                                unregistered.Clear ();