diff options
author | Mark Spruiell <mes@zeroc.com> | 2009-06-26 14:59:11 -0700 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2009-06-26 14:59:11 -0700 |
commit | 3a5f968f8487eb1f91769ab8704a9609dcbe9efe (patch) | |
tree | 469fc394f1e1e9ba0ef615c991faa524af4a21d0 | |
parent | updating CHANGES for bug 4126 (diff) | |
download | ice-3a5f968f8487eb1f91769ab8704a9609dcbe9efe.tar.bz2 ice-3a5f968f8487eb1f91769ab8704a9609dcbe9efe.tar.xz ice-3a5f968f8487eb1f91769ab8704a9609dcbe9efe.zip |
more fixes for bug 4126
-rw-r--r-- | java/src/Ice/PluginManagerI.java | 15 | ||||
-rw-r--r-- | java/src/IceBox/ServiceManagerI.java | 15 | ||||
-rw-r--r-- | java/src/IceInternal/BasicStream.java | 84 | ||||
-rw-r--r-- | java/src/IceInternal/InputStreamWrapper.java | 21 | ||||
-rw-r--r-- | java/src/IceInternal/Instance.java | 6 | ||||
-rw-r--r-- | java/src/IceInternal/ObjectInputStream.java | 45 | ||||
-rw-r--r-- | java/src/IceInternal/UdpTransceiver.java | 21 | ||||
-rw-r--r-- | java/src/IceInternal/Util.java | 64 | ||||
-rw-r--r-- | java/src/IceSSL/Instance.java | 4 |
9 files changed, 177 insertions, 98 deletions
diff --git a/java/src/Ice/PluginManagerI.java b/java/src/Ice/PluginManagerI.java index 15c916bcdd4..dbba9f1a117 100644 --- a/java/src/Ice/PluginManagerI.java +++ b/java/src/Ice/PluginManagerI.java @@ -311,7 +311,13 @@ public final class PluginManagerI implements PluginManager PluginFactory pluginFactory = null; try { - Class<?> c = Class.forName(className); + Class<?> c = IceInternal.Util.findClass(className); + if(c == null) + { + PluginInitializationException e = new PluginInitializationException(); + e.reason = "class " + className + " not found"; + throw e; + } java.lang.Object obj = c.newInstance(); try { @@ -325,13 +331,6 @@ public final class PluginManagerI implements PluginManager throw e; } } - catch(ClassNotFoundException ex) - { - PluginInitializationException e = new PluginInitializationException(); - e.reason = "class " + className + " not found"; - e.initCause(ex); - throw e; - } catch(IllegalAccessException ex) { PluginInitializationException e = new PluginInitializationException(); diff --git a/java/src/IceBox/ServiceManagerI.java b/java/src/IceBox/ServiceManagerI.java index 57c5ba9cf14..0f12e9263e3 100644 --- a/java/src/IceBox/ServiceManagerI.java +++ b/java/src/IceBox/ServiceManagerI.java @@ -481,7 +481,13 @@ public class ServiceManagerI extends _ServiceManagerDisp info.args = args; try { - Class<?> c = Class.forName(className); + Class<?> c = IceInternal.Util.findClass(className); + if(c == null) + { + FailureException e = new FailureException(); + e.reason = "ServiceManager: class " + className + " not found"; + throw e; + } java.lang.Object obj = c.newInstance(); try { @@ -494,13 +500,6 @@ public class ServiceManagerI extends _ServiceManagerDisp throw e; } } - catch(ClassNotFoundException ex) - { - FailureException e = new FailureException(); - e.reason = "ServiceManager: class " + className + " not found"; - e.initCause(ex); - throw e; - } catch(IllegalAccessException ex) { FailureException e = new FailureException(); diff --git a/java/src/IceInternal/BasicStream.java b/java/src/IceInternal/BasicStream.java index 25d40228962..57827762773 100644 --- a/java/src/IceInternal/BasicStream.java +++ b/java/src/IceInternal/BasicStream.java @@ -820,12 +820,14 @@ public class BasicStream try { InputStreamWrapper w = new InputStreamWrapper(sz, this); - java.io.ObjectInputStream in = new java.io.ObjectInputStream(w); + ObjectInputStream in = new ObjectInputStream(w); return (java.io.Serializable)in.readObject(); } catch(java.lang.Exception ex) { - throw new Ice.MarshalException("cannot deserialize object: " + ex); + Ice.MarshalException e = new Ice.MarshalException("cannot deserialize object"); + e.initCause(ex); + throw e; } } @@ -2358,58 +2360,10 @@ public class BasicStream getConcreteClass(String className) throws LinkageError { - Class<?> c = null; - - // - // Calling Class.forName() doesn't always work. For example, if Ice.jar is installed - // as an extension (in $JAVA_HOME/jre/lib/ext), calling Class.forName(name) uses the - // extension class loader, which will not look in CLASSPATH for the target class. - // - // First we try using the system class loader (which knows about CLASSPATH). Next we - // try the current thread's class loader, and finally we fall back to Class.forName(). - // - try - { - try - { - c = getConcreteClass(className, ClassLoader.getSystemClassLoader()); - } - catch(SecurityException ex) - { - } - - if(c == null) - { - try - { - c = getConcreteClass(className, Thread.currentThread().getContextClassLoader()); - } - catch(SecurityException ex) - { - } - } + Class<?> c = Util.findClass(className); - if(c == null) - { - c = Class.forName(className); - } - } - catch(ClassNotFoundException ex) + if(c != null) { - // Ignore - } - - return c; - } - - private Class<?> - getConcreteClass(String className, ClassLoader cl) - throws LinkageError - { - try - { - Class<?> c = cl.loadClass(className); - // // Ensure the class is instantiable. The constants are // defined in the JVM specification (0x200 = interface, @@ -2421,10 +2375,6 @@ public class BasicStream return c; } } - catch(ClassNotFoundException ex) - { - // Ignore - } return null; } @@ -2597,14 +2547,20 @@ public class BasicStream { Class<?> cls; Class<?>[] types = new Class<?>[1]; - cls = Class.forName("org.apache.tools.bzip2.CBZip2InputStream"); - types[0] = java.io.InputStream.class; - _bzInputStreamCtor = cls.getDeclaredConstructor(types); - cls = Class.forName("org.apache.tools.bzip2.CBZip2OutputStream"); - types = new Class[2]; - types[0] = java.io.OutputStream.class; - types[1] = Integer.TYPE; - _bzOutputStreamCtor = cls.getDeclaredConstructor(types); + cls = Util.findClass("org.apache.tools.bzip2.CBZip2InputStream"); + if(cls != null) + { + types[0] = java.io.InputStream.class; + _bzInputStreamCtor = cls.getDeclaredConstructor(types); + } + cls = Util.findClass("org.apache.tools.bzip2.CBZip2OutputStream"); + if(cls != null) + { + types = new Class[2]; + types[0] = java.io.OutputStream.class; + types[1] = Integer.TYPE; + _bzOutputStreamCtor = cls.getDeclaredConstructor(types); + } } catch(Exception ex) { diff --git a/java/src/IceInternal/InputStreamWrapper.java b/java/src/IceInternal/InputStreamWrapper.java index 1188d96d165..81b202d4d21 100644 --- a/java/src/IceInternal/InputStreamWrapper.java +++ b/java/src/IceInternal/InputStreamWrapper.java @@ -9,8 +9,6 @@ package IceInternal; -import java.io.*; - // // Class to provide a java.io.InputStream on top of a BasicStream. // We use this to deserialize arbitrary Java serializable classes from @@ -28,7 +26,8 @@ public class InputStreamWrapper extends java.io.InputStream } public int - read() throws IOException + read() + throws java.io.IOException { try { @@ -36,18 +35,20 @@ public class InputStreamWrapper extends java.io.InputStream } catch(java.lang.Exception ex) { - throw new IOException(ex.toString()); + throw new java.io.IOException(ex.toString()); } } public int - read(byte[] b) throws IOException + read(byte[] b) + throws java.io.IOException { return read(b, 0, b.length); } public int - read(byte[] b, int offset, int count) throws IOException + read(byte[] b, int offset, int count) + throws java.io.IOException { try { @@ -55,7 +56,7 @@ public class InputStreamWrapper extends java.io.InputStream } catch(java.lang.Exception ex) { - throw new IOException(ex.toString()); + throw new java.io.IOException(ex.toString()); } return count; } @@ -73,7 +74,8 @@ public class InputStreamWrapper extends java.io.InputStream } public void - reset() throws IOException + reset() + throws java.io.IOException { _s.pos(_markPos); } @@ -85,7 +87,8 @@ public class InputStreamWrapper extends java.io.InputStream } public void - close() throws IOException + close() + throws java.io.IOException { } diff --git a/java/src/IceInternal/Instance.java b/java/src/IceInternal/Instance.java index dbe3ed6a9cb..bc6ec340ee1 100644 --- a/java/src/IceInternal/Instance.java +++ b/java/src/IceInternal/Instance.java @@ -1063,12 +1063,16 @@ public final class Instance } String module = key.substring(prefix.length()); String className = pkg + "." + module + "._Marker"; + Class<?> cls = null; try { - Class.forName(className); + cls = Util.findClass(className); } catch(java.lang.Exception ex) { + } + if(cls == null) + { _initData.logger.warning("unable to validate package: " + key + "=" + pkg); } } diff --git a/java/src/IceInternal/ObjectInputStream.java b/java/src/IceInternal/ObjectInputStream.java new file mode 100644 index 00000000000..e5fa8e0b45a --- /dev/null +++ b/java/src/IceInternal/ObjectInputStream.java @@ -0,0 +1,45 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2009 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +package IceInternal; + +// +// We need to override the resolveClass method of ObjectInputStream so +// that we can use the same class-lookup mechanism as elsewhere in the +// Ice run time. +// + +public class ObjectInputStream extends java.io.ObjectInputStream +{ + public + ObjectInputStream(java.io.InputStream in) + throws java.io.IOException + { + super(in); + } + + protected Class<?> + resolveClass(java.io.ObjectStreamClass cls) + throws java.io.IOException, ClassNotFoundException + { + try + { + Class<?> c = Util.findClass(cls.getName()); + if(c != null) + { + return c; + } + throw new ClassNotFoundException("unable to resolve class" + cls.getName()); + } + catch(Exception ex) + { + throw new ClassNotFoundException("unable to resolve class " + cls.getName(), ex); + } + } +} diff --git a/java/src/IceInternal/UdpTransceiver.java b/java/src/IceInternal/UdpTransceiver.java index e0076beed55..1dec5fde575 100644 --- a/java/src/IceInternal/UdpTransceiver.java +++ b/java/src/IceInternal/UdpTransceiver.java @@ -455,8 +455,14 @@ final class UdpTransceiver implements Transceiver { try { - java.lang.reflect.Constructor<?> c = - Class.forName("java.net.PlainDatagramSocketImpl").getDeclaredConstructor((Class<?>[])null); + Class<?> cls; + + cls = Util.findClass("java.net.PlainDatagramSocketImpl"); + if(cls == null) + { + throw new Ice.SocketException(); + } + java.lang.reflect.Constructor<?> c = cls.getDeclaredConstructor((Class<?>[])null); c.setAccessible(true); java.net.DatagramSocketImpl socketImpl = (java.net.DatagramSocketImpl)c.newInstance((Object[])null); @@ -464,13 +470,16 @@ final class UdpTransceiver implements Transceiver // We have to invoke the protected create() method on the PlainDatagramSocketImpl object so // that this hack works properly when IPv6 is enabled on Windows. // - java.lang.reflect.Method m = - Class.forName("java.net.PlainDatagramSocketImpl").getDeclaredMethod("create", (Class<?>[])null); + java.lang.reflect.Method m = cls.getDeclaredMethod("create", (Class<?>[])null); m.setAccessible(true); m.invoke(socketImpl); - java.lang.reflect.Field channelFd = - Class.forName("sun.nio.ch.DatagramChannelImpl").getDeclaredField("fd"); + cls = Util.findClass("sun.nio.ch.DatagramChannelImpl"); + if(cls == null) + { + throw new Ice.SocketException(); + } + java.lang.reflect.Field channelFd = cls.getDeclaredField("fd"); channelFd.setAccessible(true); java.lang.reflect.Field socketFd = java.net.DatagramSocketImpl.class.getDeclaredField("fd"); diff --git a/java/src/IceInternal/Util.java b/java/src/IceInternal/Util.java index 2a1f70ce69c..b55c23fdca5 100644 --- a/java/src/IceInternal/Util.java +++ b/java/src/IceInternal/Util.java @@ -59,4 +59,68 @@ public final class Util return stream; } + + public static Class<?> + findClass(String className) + throws LinkageError + { + Class<?> c = null; + + // + // Calling Class.forName() doesn't always work. For example, if Ice.jar is installed + // as an extension (in $JAVA_HOME/jre/lib/ext), calling Class.forName(name) uses the + // extension class loader, which will not look in CLASSPATH for the target class. + // + // First we try using the system class loader (which knows about CLASSPATH). Next we + // try the current thread's class loader, and finally we fall back to Class.forName(). + // + try + { + try + { + c = findClass(className, ClassLoader.getSystemClassLoader()); + } + catch(SecurityException ex) + { + } + + if(c == null) + { + try + { + c = findClass(className, Thread.currentThread().getContextClassLoader()); + } + catch(SecurityException ex) + { + } + } + + if(c == null) + { + c = Class.forName(className); + } + } + catch(ClassNotFoundException ex) + { + // Ignore + } + + return c; + } + + private static Class<?> + findClass(String className, ClassLoader cl) + throws LinkageError + { + try + { + return cl.loadClass(className); + } + catch(ClassNotFoundException ex) + { + // Ignore + } + + return null; + } } diff --git a/java/src/IceSSL/Instance.java b/java/src/IceSSL/Instance.java index d91c25735e9..e86fce50900 100644 --- a/java/src/IceSSL/Instance.java +++ b/java/src/IceSSL/Instance.java @@ -109,7 +109,7 @@ class Instance Class<?> cls = null; try { - cls = Class.forName(certVerifierClass); + cls = IceInternal.Util.findClass(certVerifierClass); } catch(Throwable ex) { @@ -148,7 +148,7 @@ class Instance Class<?> cls = null; try { - cls = Class.forName(passwordCallbackClass); + cls = IceInternal.Util.findClass(passwordCallbackClass); } catch(Throwable ex) { |