mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 15:24:43 +02:00
8305529: DefaultProxySelector.select(URI) in certain cases returns a List with null element
Reviewed-by: dfuchs, djelinski, michaelm
This commit is contained in:
parent
425ef0685c
commit
3f36dd811e
3 changed files with 131 additions and 2 deletions
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2004, 2022, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -97,6 +97,7 @@ typedef GSocketConnectable* g_network_address_parse_uri_func();
|
||||||
typedef const char* g_network_address_get_hostname_func();
|
typedef const char* g_network_address_get_hostname_func();
|
||||||
typedef unsigned short g_network_address_get_port_func();
|
typedef unsigned short g_network_address_get_port_func();
|
||||||
typedef void g_strfreev_func();
|
typedef void g_strfreev_func();
|
||||||
|
typedef void g_clear_error_func();
|
||||||
|
|
||||||
static g_proxy_resolver_get_default_func* g_proxy_resolver_get_default = NULL;
|
static g_proxy_resolver_get_default_func* g_proxy_resolver_get_default = NULL;
|
||||||
static g_proxy_resolver_lookup_func* g_proxy_resolver_lookup = NULL;
|
static g_proxy_resolver_lookup_func* g_proxy_resolver_lookup = NULL;
|
||||||
|
@ -104,6 +105,7 @@ static g_network_address_parse_uri_func* g_network_address_parse_uri = NULL;
|
||||||
static g_network_address_get_hostname_func* g_network_address_get_hostname = NULL;
|
static g_network_address_get_hostname_func* g_network_address_get_hostname = NULL;
|
||||||
static g_network_address_get_port_func* g_network_address_get_port = NULL;
|
static g_network_address_get_port_func* g_network_address_get_port = NULL;
|
||||||
static g_strfreev_func* g_strfreev = NULL;
|
static g_strfreev_func* g_strfreev = NULL;
|
||||||
|
static g_clear_error_func* g_clear_error = NULL;
|
||||||
|
|
||||||
static void* gconf_client = NULL;
|
static void* gconf_client = NULL;
|
||||||
static int use_gproxyResolver = 0;
|
static int use_gproxyResolver = 0;
|
||||||
|
@ -317,13 +319,16 @@ static int initGProxyResolver() {
|
||||||
|
|
||||||
g_strfreev = (g_strfreev_func*)dlsym(gio_handle, "g_strfreev");
|
g_strfreev = (g_strfreev_func*)dlsym(gio_handle, "g_strfreev");
|
||||||
|
|
||||||
|
g_clear_error = (g_clear_error_func*)dlsym(gio_handle, "g_clear_error");
|
||||||
|
|
||||||
if (!my_g_type_init_func ||
|
if (!my_g_type_init_func ||
|
||||||
!g_proxy_resolver_get_default ||
|
!g_proxy_resolver_get_default ||
|
||||||
!g_proxy_resolver_lookup ||
|
!g_proxy_resolver_lookup ||
|
||||||
!g_network_address_parse_uri ||
|
!g_network_address_parse_uri ||
|
||||||
!g_network_address_get_hostname ||
|
!g_network_address_get_hostname ||
|
||||||
!g_network_address_get_port ||
|
!g_network_address_get_port ||
|
||||||
!g_strfreev)
|
!g_strfreev ||
|
||||||
|
!g_clear_error)
|
||||||
{
|
{
|
||||||
dlclose(gio_handle);
|
dlclose(gio_handle);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -412,7 +417,13 @@ static jobjectArray getProxyByGProxyResolver(JNIEnv *env, const char *cproto,
|
||||||
proxy_array = NULL;
|
proxy_array = NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
proxy_array = NULL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
proxy_array = NULL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* direct connection - no proxy */
|
/* direct connection - no proxy */
|
||||||
|
@ -432,6 +443,9 @@ static jobjectArray getProxyByGProxyResolver(JNIEnv *env, const char *cproto,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(*g_strfreev)(proxies);
|
(*g_strfreev)(proxies);
|
||||||
|
// as per API doc, g_clear_error doesn't complain if error is NULL, so it's safe to
|
||||||
|
// call without null checks
|
||||||
|
(*g_clear_error)(&error);
|
||||||
}
|
}
|
||||||
|
|
||||||
return proxy_array;
|
return proxy_array;
|
||||||
|
|
56
test/jdk/sun/net/spi/SystemProxyDriver.java
Normal file
56
test/jdk/sun/net/spi/SystemProxyDriver.java
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import jdk.test.lib.process.ProcessTools;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @test
|
||||||
|
* @bug 8305529
|
||||||
|
* @summary Verifies that the sun.net.spi.DefaultProxySelector#select(URI) doesn't return a List
|
||||||
|
* with null elements in it
|
||||||
|
* @modules java.base/sun.net.spi:+open
|
||||||
|
* @library /test/lib
|
||||||
|
* @build jdk.test.lib.process.ProcessTools SystemProxyTest
|
||||||
|
* @run driver SystemProxyDriver
|
||||||
|
*/
|
||||||
|
public class SystemProxyDriver {
|
||||||
|
// launches the SystemProxyTest as a separate process and verifies that the test passes
|
||||||
|
public static void main(final String[] args) throws Exception {
|
||||||
|
final String[] commandArgs = new String[]{
|
||||||
|
"--add-opens",
|
||||||
|
"java.base/sun.net.spi=ALL-UNNAMED",
|
||||||
|
// trigger use of the http_proxy environment variable that we pass when launching
|
||||||
|
// this Java program
|
||||||
|
"-Djava.net.useSystemProxies=true",
|
||||||
|
"SystemProxyTest"
|
||||||
|
};
|
||||||
|
final ProcessBuilder pb = ProcessTools.createTestJvm(commandArgs);
|
||||||
|
pb.inheritIO();
|
||||||
|
pb.environment().put("http_proxy", "foo://"); // intentionally use a value without host/port
|
||||||
|
final Process p = pb.start();
|
||||||
|
final int exitCode = p.waitFor();
|
||||||
|
if (exitCode != 0) {
|
||||||
|
throw new RuntimeException("Test failed, exitCode: " + exitCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
59
test/jdk/sun/net/spi/SystemProxyTest.java
Normal file
59
test/jdk/sun/net/spi/SystemProxyTest.java
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.net.Proxy;
|
||||||
|
import java.net.ProxySelector;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import sun.net.spi.DefaultProxySelector;
|
||||||
|
|
||||||
|
// this test is launched from SystemProxyDriver
|
||||||
|
public class SystemProxyTest {
|
||||||
|
|
||||||
|
// calls the DefaultProxySelector.select(URI) and verifies that the returned List is
|
||||||
|
// not null, not empty and doesn't contain null elements.
|
||||||
|
public static void main(final String[] args) throws Exception {
|
||||||
|
final ProxySelector ps = new DefaultProxySelector();
|
||||||
|
final URI uri = new URI("http://example.com"); // the target URL doesn't matter
|
||||||
|
final List<Proxy> proxies = ps.select(uri);
|
||||||
|
if (proxies == null) {
|
||||||
|
// null isn't expected to be returned by the select() API
|
||||||
|
throw new AssertionError("DefaultProxySelector.select(URI) returned null for uri: "
|
||||||
|
+ uri);
|
||||||
|
}
|
||||||
|
if (proxies.isEmpty()) {
|
||||||
|
// empty list isn't expected to be returned by the select() API, instead when
|
||||||
|
// no proxy is configured, the returned list is expected to contain one entry with
|
||||||
|
// a Proxy instance representing direct connection
|
||||||
|
throw new AssertionError("DefaultProxySelector.select(URI) returned empty list" +
|
||||||
|
" for uri: " + uri);
|
||||||
|
}
|
||||||
|
System.out.println("returned proxies list: " + proxies);
|
||||||
|
for (final Proxy p : proxies) {
|
||||||
|
if (p == null) {
|
||||||
|
throw new AssertionError("null proxy in proxies list for uri: " + uri);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue