This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patch: FYI: PR libgcj/21785


I'm checking this in on the trunk.

This fixes PR libgcj/21785, a serialization regression on the trunk.
It also brings us closer in line with Classpath here.

The bug was that ObjectInputStream.currentLoader was not properly
finding the caller's class loader.

Due to a compiler problem I can't build Mauve at the moment.  I will
investigate that shortly.  If there turns out to be Mauve fallout from
this patch, I'll fix it.

Tom

Index: ChangeLog
from  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.

Index: java/io/ObjectInputStream.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/io/ObjectInputStream.java,v
retrieving revision 1.41
diff -u -r1.41 ObjectInputStream.java
--- java/io/ObjectInputStream.java 22 Feb 2005 03:13:31 -0000 1.41
+++ java/io/ObjectInputStream.java 1 Jun 2005 19:41:22 -0000
@@ -783,21 +783,11 @@
   }
 
   /**
-   * 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 @@
   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 @@
       }
   }
 
-  /**
-   * 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
   {
Index: java/io/natObjectInputStream.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/io/natObjectInputStream.cc,v
retrieving revision 1.9
diff -u -r1.9 natObjectInputStream.cc
--- java/io/natObjectInputStream.cc 22 Feb 2005 03:13:34 -0000 1.9
+++ java/io/natObjectInputStream.cc 1 Jun 2005 19:41:22 -0000
@@ -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 @@
 #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 @@
   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;
 }
-
Index: testsuite/libjava.lang/pr21785.java
===================================================================
RCS file: testsuite/libjava.lang/pr21785.java
diff -N testsuite/libjava.lang/pr21785.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/libjava.lang/pr21785.java 1 Jun 2005 19:41:23 -0000
@@ -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);
+    }
+  }
+}
Index: testsuite/libjava.lang/pr21785.out
===================================================================
RCS file: testsuite/libjava.lang/pr21785.out
diff -N testsuite/libjava.lang/pr21785.out


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]