aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libjava/ChangeLog12
-rw-r--r--libjava/java/io/ObjectInputStream.java34
-rw-r--r--libjava/java/io/natObjectInputStream.cc13
-rw-r--r--libjava/testsuite/libjava.lang/pr21785.java21
-rw-r--r--libjava/testsuite/libjava.lang/pr21785.out0
5 files changed, 46 insertions, 34 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index cddaecb..a22d520 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,5 +1,17 @@
2005-06-01 Tom Tromey <tromey@redhat.com>
+ PR libgcj/21785:
+ * java/io/natObjectInputStream.cc (currentClassLoader): Removed.
+ (currentLoader): New method.
+ * java/io/ObjectInputStream.java (resolveProxyClass): Use
+ currentLoader.
+ (currentLoader): Now native.
+ (currentClassLoader): Removed.
+ * testsuite/libjava.lang/pr21785.java: New file.
+ * testsuite/libjava.lang/pr21785.out: New file.
+
+2005-06-01 Tom Tromey <tromey@redhat.com>
+
PR libgcj/21753:
* java/lang/natString.cc (substring): Changed sharing heuristic.
diff --git a/libjava/java/io/ObjectInputStream.java b/libjava/java/io/ObjectInputStream.java
index 2cfe4c9..0a97486 100644
--- a/libjava/java/io/ObjectInputStream.java
+++ b/libjava/java/io/ObjectInputStream.java
@@ -783,21 +783,11 @@ public class ObjectInputStream extends InputStream
}
/**
- * This method invokes the method currentClassLoader for the
- * current security manager (or build an empty one if it is not
- * present).
- *
- * @return The most recent non-system ClassLoader on the execution stack.
- * @see java.lang.SecurityManager#currentClassLoader()
+ * Returns he most recent user defined ClassLoader on the execution stack
+ * or null of none is found.
*/
- private ClassLoader currentLoader()
- {
- SecurityManager sm = System.getSecurityManager();
- if (sm == null)
- sm = new SecurityManager () {};
-
- return currentClassLoader(sm);
- }
+ // GCJ LOCAL: native method.
+ private native ClassLoader currentLoader();
/**
* Lookup a class stored in the local hashtable. If it is not
@@ -883,12 +873,7 @@ public class ObjectInputStream extends InputStream
protected Class resolveProxyClass(String[] intfs)
throws IOException, ClassNotFoundException
{
- SecurityManager sm = System.getSecurityManager();
-
- if (sm == null)
- sm = new SecurityManager() {};
-
- ClassLoader cl = currentClassLoader(sm);
+ ClassLoader cl = currentLoader();
Class[] clss = new Class[intfs.length];
if(cl == null)
@@ -1866,15 +1851,6 @@ public class ObjectInputStream extends InputStream
}
}
- /**
- * This native method is used to get access to the protected method
- * of the same name in SecurityManger.
- *
- * @param sm SecurityManager instance which should be called.
- * @return The current class loader in the calling stack.
- */
- private static native ClassLoader currentClassLoader (SecurityManager sm);
-
private void callReadMethod (Method readObject, Class klass, Object obj)
throws ClassNotFoundException, IOException
{
diff --git a/libjava/java/io/natObjectInputStream.cc b/libjava/java/io/natObjectInputStream.cc
index 0e0d5a7..2d1a556 100644
--- a/libjava/java/io/natObjectInputStream.cc
+++ b/libjava/java/io/natObjectInputStream.cc
@@ -1,6 +1,6 @@
// natObjectInputStream.cc - Native part of ObjectInputStream class.
-/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001, 2005 Free Software Foundation
This ObjectInputStream is part of libgcj.
@@ -24,6 +24,7 @@ details. */
#include <java/lang/SecurityManager.h>
#include <java/lang/reflect/Constructor.h>
#include <java/lang/reflect/Method.h>
+#include <java-stack.h>
#ifdef DEBUG
#include <java/lang/System.h>
@@ -69,9 +70,11 @@ java::io::ObjectInputStream::allocateObject (jclass klass, jclass,
return obj;
}
-java::lang::ClassLoader*
-java::io::ObjectInputStream::currentClassLoader (::java::lang::SecurityManager *sm)
+java::lang::ClassLoader *
+java::io::ObjectInputStream::currentLoader ()
{
- return sm->currentClassLoader ();
+ jclass caller = _Jv_StackTrace::GetCallingClass (&ObjectInputStream::class$);
+ if (caller)
+ return caller->getClassLoaderInternal();
+ return NULL;
}
-
diff --git a/libjava/testsuite/libjava.lang/pr21785.java b/libjava/testsuite/libjava.lang/pr21785.java
new file mode 100644
index 0000000..7869754
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/pr21785.java
@@ -0,0 +1,21 @@
+import java.io.*;
+
+public class pr21785 implements Serializable
+{
+ public static void main(String[] args)
+ {
+ try {
+ ByteArrayOutputStream outb = new ByteArrayOutputStream();
+ ObjectOutputStream outs = new ObjectOutputStream(outb);
+ outs.writeObject(new pr21785());
+ byte[] store = outb.toByteArray();
+
+ ByteArrayInputStream inb = new ByteArrayInputStream(store);
+ ObjectInputStream ins = new ObjectInputStream(inb);
+ ins.readObject();
+ }
+ catch (Throwable e) {
+ throw new Error(e);
+ }
+ }
+}
diff --git a/libjava/testsuite/libjava.lang/pr21785.out b/libjava/testsuite/libjava.lang/pr21785.out
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/pr21785.out