aboutsummaryrefslogtreecommitdiff
path: root/java/openjdk6/files/icedtea/security/7195919.patch
diff options
context:
space:
mode:
Diffstat (limited to 'java/openjdk6/files/icedtea/security/7195919.patch')
-rw-r--r--java/openjdk6/files/icedtea/security/7195919.patch63
1 files changed, 63 insertions, 0 deletions
diff --git a/java/openjdk6/files/icedtea/security/7195919.patch b/java/openjdk6/files/icedtea/security/7195919.patch
new file mode 100644
index 000000000000..2d14c00701b8
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/7195919.patch
@@ -0,0 +1,63 @@
+# HG changeset patch
+# User dmeetry
+# Date 1347313661 -14400
+# Node ID 5352a40bb0ff7e8a6e826478d7687fff695d9805
+# Parent 074f132d65c91231ca989e4c757207e1cf25a476
+7195919: (sl) ServiceLoader can throw CCE without needing to create instance
+Reviewed-by: smarks
+
+diff --git a/src/share/classes/java/util/ServiceLoader.java b/src/share/classes/java/util/ServiceLoader.java
+--- jdk/src/share/classes/java/util/ServiceLoader.java
++++ jdk/src/share/classes/java/util/ServiceLoader.java
+@@ -358,14 +358,21 @@
+ }
+ String cn = nextName;
+ nextName = null;
++ Class<?> c = null;
+ try {
+- S p = service.cast(Class.forName(cn, true, loader)
+- .newInstance());
+- providers.put(cn, p);
+- return p;
++ c = Class.forName(cn, false, loader);
+ } catch (ClassNotFoundException x) {
+ fail(service,
+ "Provider " + cn + " not found");
++ }
++ if (!service.isAssignableFrom(c)) {
++ fail(service,
++ "Provider " + cn + " not a subtype");
++ }
++ try {
++ S p = service.cast(c.newInstance());
++ providers.put(cn, p);
++ return p;
+ } catch (Throwable x) {
+ fail(service,
+ "Provider " + cn + " could not be instantiated: " + x,
+diff --git a/src/share/classes/sun/misc/Service.java b/src/share/classes/sun/misc/Service.java
+--- jdk/src/share/classes/sun/misc/Service.java
++++ jdk/src/share/classes/sun/misc/Service.java
+@@ -284,12 +284,20 @@
+ }
+ String cn = nextName;
+ nextName = null;
++ Class<?> c = null;
+ try {
+- return Class.forName(cn, true, loader).newInstance();
++ c = Class.forName(cn, false, loader);
+ } catch (ClassNotFoundException x) {
+ fail(service,
+ "Provider " + cn + " not found");
+- } catch (Exception x) {
++ }
++ if (!service.isAssignableFrom(c)) {
++ fail(service,
++ "Provider " + cn + " not a subtype");
++ }
++ try {
++ return service.cast(c.newInstance());
++ } catch (Throwable x) {
+ fail(service,
+ "Provider " + cn + " could not be instantiated: " + x,
+ x);