Commit f7fe97da by Tom Tromey Committed by Tom Tromey

re PR libgcj/11737 (java.io.ObjectOutputStream.writeObject does not work with HashMap)

	Fix for PR libgcj/11737:
	* java/io/ObjectOutputStream.java (getMethod): Make method
	accessible.
	(getField): Likewise.
	(writeObject): Use getMethod.
	Import PrivilegedAction and AccessController.
	(callWriteMethod): Don't check whether m is null.  Catch
	NoSuchMethodException.

From-SVN: r70035
parent 3c260e1d
2003-07-31 Tom Tromey <tromey@redhat.com> 2003-07-31 Tom Tromey <tromey@redhat.com>
Fix for PR libgcj/11737:
* java/io/ObjectOutputStream.java (getMethod): Make method
accessible.
(getField): Likewise.
(writeObject): Use getMethod.
Import PrivilegedAction and AccessController.
(callWriteMethod): Don't check whether m is null. Catch
NoSuchMethodException.
* java/awt/geom/Arc2D.java (getBounds2D): Implement. * java/awt/geom/Arc2D.java (getBounds2D): Implement.
(containsAngle): Likewise. (containsAngle): Likewise.
(getStartPoint): Rewrote. (getStartPoint): Rewrote.
......
...@@ -42,6 +42,8 @@ import java.lang.reflect.Array; ...@@ -42,6 +42,8 @@ import java.lang.reflect.Array;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.security.PrivilegedAction;
import java.security.AccessController;
import java.util.Hashtable; import java.util.Hashtable;
import gnu.java.io.ObjectIdentityWrapper; import gnu.java.io.ObjectIdentityWrapper;
...@@ -240,10 +242,11 @@ public class ObjectOutputStream extends OutputStream ...@@ -240,10 +242,11 @@ public class ObjectOutputStream extends OutputStream
try try
{ {
Class classArgs[] = {}; Class classArgs[] = {};
m = obj.getClass ().getDeclaredMethod ("writeReplace", m = getMethod(obj.getClass(), "writeReplace",
classArgs); classArgs);
// m can't be null by definition since an exception would // m can't be null by definition since an
// have been thrown so a check for null is not needed. // exception would have been thrown so a check
// for null is not needed.
obj = m.invoke (obj, new Object[] {}); obj = m.invoke (obj, new Object[] {});
} }
catch (NoSuchMethodException ignore) catch (NoSuchMethodException ignore)
...@@ -993,7 +996,8 @@ public class ObjectOutputStream extends OutputStream ...@@ -993,7 +996,8 @@ public class ObjectOutputStream extends OutputStream
private void checkType (ObjectStreamField field, char type) private void checkType (ObjectStreamField field, char type)
throws IllegalArgumentException throws IllegalArgumentException
{ {
if (TypeSignature.getEncodingOfClass (field.getType ()).charAt (0) != type) if (TypeSignature.getEncodingOfClass (field.getType ()).charAt (0)
!= type)
throw new IllegalArgumentException (); throw new IllegalArgumentException ();
} }
}; };
...@@ -1200,11 +1204,13 @@ public class ObjectOutputStream extends OutputStream ...@@ -1200,11 +1204,13 @@ public class ObjectOutputStream extends OutputStream
{ {
Class classArgs[] = {ObjectOutputStream.class}; Class classArgs[] = {ObjectOutputStream.class};
Method m = getMethod (klass, "writeObject", classArgs); Method m = getMethod (klass, "writeObject", classArgs);
if (m == null)
return;
Object args[] = {this}; Object args[] = {this};
m.invoke (obj, args); m.invoke (obj, args);
} }
catch (NoSuchMethodException nsme)
{
// Nothing.
}
catch (InvocationTargetException x) catch (InvocationTargetException x)
{ {
/* Rethrow if possible. */ /* Rethrow if possible. */
...@@ -1239,7 +1245,8 @@ public class ObjectOutputStream extends OutputStream ...@@ -1239,7 +1245,8 @@ public class ObjectOutputStream extends OutputStream
} }
} }
private byte getByteField (Object obj, Class klass, String field_name) throws IOException private byte getByteField (Object obj, Class klass, String field_name)
throws IOException
{ {
try try
{ {
...@@ -1253,7 +1260,8 @@ public class ObjectOutputStream extends OutputStream ...@@ -1253,7 +1260,8 @@ public class ObjectOutputStream extends OutputStream
} }
} }
private char getCharField (Object obj, Class klass, String field_name) throws IOException private char getCharField (Object obj, Class klass, String field_name)
throws IOException
{ {
try try
{ {
...@@ -1297,7 +1305,8 @@ public class ObjectOutputStream extends OutputStream ...@@ -1297,7 +1305,8 @@ public class ObjectOutputStream extends OutputStream
} }
} }
private int getIntField (Object obj, Class klass, String field_name) throws IOException private int getIntField (Object obj, Class klass, String field_name)
throws IOException
{ {
try try
{ {
...@@ -1311,7 +1320,8 @@ public class ObjectOutputStream extends OutputStream ...@@ -1311,7 +1320,8 @@ public class ObjectOutputStream extends OutputStream
} }
} }
private long getLongField (Object obj, Class klass, String field_name) throws IOException private long getLongField (Object obj, Class klass, String field_name)
throws IOException
{ {
try try
{ {
...@@ -1359,13 +1369,31 @@ public class ObjectOutputStream extends OutputStream ...@@ -1359,13 +1369,31 @@ public class ObjectOutputStream extends OutputStream
private static Field getField (Class klass, String name) private static Field getField (Class klass, String name)
throws java.lang.NoSuchFieldException throws java.lang.NoSuchFieldException
{ {
return klass.getDeclaredField(name); final Field f = klass.getDeclaredField(name);
AccessController.doPrivileged(new PrivilegedAction()
{
public Object run()
{
f.setAccessible(true);
return null;
}
});
return f;
} }
private static Method getMethod (Class klass, String name, Class[] args) private static Method getMethod (Class klass, String name, Class[] args)
throws java.lang.NoSuchMethodException throws java.lang.NoSuchMethodException
{ {
return klass.getDeclaredMethod(name, args); final Method m = klass.getDeclaredMethod(name, args);
AccessController.doPrivileged(new PrivilegedAction()
{
public Object run()
{
m.setAccessible(true);
return null;
}
});
return m;
} }
// this value comes from 1.2 spec, but is used in 1.1 as well // this value comes from 1.2 spec, but is used in 1.1 as well
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment