8028453: AsynchronousSocketChannel.connect() requires SocketPermission due to bind to local address (win)
authormichaelm
Wed, 20 Nov 2013 23:33:07 +0000
changeset 22340 79163d48aeda
parent 22339 e91bfaf4360d
child 22341 4689530d03b9
8028453: AsynchronousSocketChannel.connect() requires SocketPermission due to bind to local address (win) Reviewed-by: alanb, chegar
jdk/src/windows/classes/sun/nio/ch/WindowsAsynchronousSocketChannelImpl.java
--- a/jdk/src/windows/classes/sun/nio/ch/WindowsAsynchronousSocketChannelImpl.java	Thu Oct 24 20:39:21 2013 +0100
+++ b/jdk/src/windows/classes/sun/nio/ch/WindowsAsynchronousSocketChannelImpl.java	Wed Nov 20 23:33:07 2013 +0000
@@ -31,6 +31,9 @@
 import java.net.*;
 import java.util.concurrent.*;
 import java.io.IOException;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
 import sun.misc.Unsafe;
 
 /**
@@ -300,6 +303,19 @@
         }
     }
 
+    private void doPrivilegedBind(final SocketAddress sa) throws IOException {
+        try {
+            AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() {
+                public Void run() throws IOException {
+                    bind(sa);
+                    return null;
+                }
+            });
+        } catch (PrivilegedActionException e) {
+            throw (IOException) e.getException();
+        }
+    }
+
     @Override
     <A> Future<Void> implConnect(SocketAddress remote,
                                  A attachment,
@@ -330,7 +346,12 @@
                 throw new ConnectionPendingException();
             if (localAddress == null) {
                 try {
-                    bind(new InetSocketAddress(0));
+                    SocketAddress any = new InetSocketAddress(0);
+                    if (sm == null) {
+                        bind(any);
+                    } else {
+                        doPrivilegedBind(any);
+                    }
                 } catch (IOException x) {
                     bindException = x;
                 }