8028453: AsynchronousSocketChannel.connect() requires SocketPermission due to bind to local address (win)
Reviewed-by: alanb, chegar
--- 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;
}