From 6d78b91ac967f2e19850e8ffb6c1faa7389896a4 Mon Sep 17 00:00:00 2001 From: Sean Coffey Date: Wed, 25 Feb 2015 11:44:53 +0000 Subject: [PATCH] 7178362: Socket impls should ignore unsupported proxy types rather than throwing Reviewed-by: chegar --- .../classes/java/net/SocksSocketImpl.java | 14 ++- jdk/test/java/net/Socks/BadProxySelector.java | 85 +++++++++++++++++++ 2 files changed, 91 insertions(+), 8 deletions(-) create mode 100644 jdk/test/java/net/Socks/BadProxySelector.java diff --git a/jdk/src/java.base/share/classes/java/net/SocksSocketImpl.java b/jdk/src/java.base/share/classes/java/net/SocksSocketImpl.java index 7c0f899b8e6..3dd4259cd9a 100644 --- a/jdk/src/java.base/share/classes/java/net/SocksSocketImpl.java +++ b/jdk/src/java.base/share/classes/java/net/SocksSocketImpl.java @@ -388,14 +388,13 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { } while (iProxy.hasNext()) { p = iProxy.next(); - if (p == null || p == Proxy.NO_PROXY) { + if (p == null || p.type() != Proxy.Type.SOCKS) { super.connect(epoint, remainingMillis(deadlineMillis)); return; } - if (p.type() != Proxy.Type.SOCKS) - throw new SocketException("Unknown proxy type : " + p.type()); + if (!(p.address() instanceof InetSocketAddress)) - throw new SocketException("Unknow address type for proxy: " + p); + throw new SocketException("Unknown address type for proxy: " + p); // Use getHostString() to avoid reverse lookups server = ((InetSocketAddress) p.address()).getHostString(); serverPort = ((InetSocketAddress) p.address()).getPort(); @@ -707,13 +706,12 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { } while (iProxy.hasNext()) { p = iProxy.next(); - if (p == null || p == Proxy.NO_PROXY) { + if (p == null || p.type() != Proxy.Type.SOCKS) { return; } - if (p.type() != Proxy.Type.SOCKS) - throw new SocketException("Unknown proxy type : " + p.type()); + if (!(p.address() instanceof InetSocketAddress)) - throw new SocketException("Unknow address type for proxy: " + p); + throw new SocketException("Unknown address type for proxy: " + p); // Use getHostString() to avoid reverse lookups server = ((InetSocketAddress) p.address()).getHostString(); serverPort = ((InetSocketAddress) p.address()).getPort(); diff --git a/jdk/test/java/net/Socks/BadProxySelector.java b/jdk/test/java/net/Socks/BadProxySelector.java new file mode 100644 index 00000000000..008e9fc4b00 --- /dev/null +++ b/jdk/test/java/net/Socks/BadProxySelector.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7178362 + * @run main/othervm BadProxySelector + */ + +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.ProxySelector; +import java.net.Socket; +import java.net.SocketAddress; +import java.net.ServerSocket; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.io.*; + +public class BadProxySelector { + public static void main(String[] args) throws Exception { + ProxySelector.setDefault(new HTTPProxySelector()); + try (ServerSocket ss = new ServerSocket(0); + Socket s1 = new Socket(ss.getInetAddress(), ss.getLocalPort()); + Socket s2 = ss.accept()) { + } + + ProxySelector.setDefault(new NullHTTPProxySelector()); + try (ServerSocket ss = new ServerSocket(0); + Socket s1 = new Socket(ss.getInetAddress(), ss.getLocalPort()); + Socket s2 = ss.accept()) { + } + } + + // always returns bogus HTTP proxies + private static class HTTPProxySelector extends ProxySelector { + @Override + public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {} + + @Override + public List select(URI uri) { + List proxies = new ArrayList<>(); + proxies.add(new Proxy(Proxy.Type.HTTP, + new InetSocketAddress("localhost", 0))); + proxies.add(new Proxy(Proxy.Type.HTTP, + new InetSocketAddress("localhost", 0))); + return proxies; + } + } + + private static class NullHTTPProxySelector extends ProxySelector { + @Override + public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {} + + @Override + public List select(URI uri) { + List proxies = new ArrayList<>(); + proxies.add(null); + proxies.add(new Proxy(Proxy.Type.HTTP, + new InetSocketAddress("localhost", 0))); + return proxies; + } + } +}