Commit 646e3290 by Guilhem Lavaux Committed by Michael Koch

2004-02-28 Guilhem Lavaux <guilhem@kaffe.org>

	* java/io/ObjectInputStream.java
	(readClassDescriptor): Keep elements of the mapping non null.
	(checkTypeConsistency): New method.
	(readFields): Fixed main loop and base logic. Small reindentation.
	* java/io/ObjectStreamField.java
	(lookupField): New method to update the field reference.
	(checkFieldType): New method.
	* java/io/ObjectStreamClass.java
	(setClass, setFields): Call lookupField when building the field
	database. Check the real field type.

From-SVN: r78627
parent ca67f278
2004-02-28 Guilhem Lavaux <guilhem@kaffe.org>
* java/io/ObjectInputStream.java
(readClassDescriptor): Keep elements of the mapping non null.
(checkTypeConsistency): New method.
(readFields): Fixed main loop and base logic. Small reindentation.
* java/io/ObjectStreamField.java
(lookupField): New method to update the field reference.
(checkFieldType): New method.
* java/io/ObjectStreamClass.java
(setClass, setFields): Call lookupField when building the field
database. Check the real field type.
2004-02-28 Michael Koch <konqueror@gmx.de> 2004-02-28 Michael Koch <konqueror@gmx.de>
* java/nio/ByteOrder.java * java/nio/ByteOrder.java
......
...@@ -327,7 +327,7 @@ public class ObjectStreamClass implements Serializable ...@@ -327,7 +327,7 @@ public class ObjectStreamClass implements Serializable
i = 0; j = 0; k = 0; i = 0; j = 0; k = 0;
while (i < fields.length && j < exportedFields.length) while (i < fields.length && j < exportedFields.length)
{ {
int comp = fields[i].getName().compareTo(exportedFields[j].getName()); int comp = fields[i].compareTo(exportedFields[j]);
if (comp < 0) if (comp < 0)
{ {
...@@ -344,10 +344,27 @@ public class ObjectStreamClass implements Serializable ...@@ -344,10 +344,27 @@ public class ObjectStreamClass implements Serializable
newFieldList[k] = exportedFields[j]; newFieldList[k] = exportedFields[j];
newFieldList[k].setPersistent(true); newFieldList[k].setPersistent(true);
newFieldList[k].setToSet(false); newFieldList[k].setToSet(false);
try
{
newFieldList[k].lookupField(clazz);
newFieldList[k].checkFieldType();
}
catch (NoSuchFieldException _)
{
}
j++; j++;
} }
else else
{ {
try
{
exportedFields[j].lookupField(clazz);
exportedFields[j].checkFieldType();
}
catch (NoSuchFieldException _)
{
}
if (!fields[i].getType().equals(exportedFields[j].getType())) if (!fields[i].getType().equals(exportedFields[j].getType()))
throw new InvalidClassException throw new InvalidClassException
("serialPersistentFields must be compatible with" + ("serialPersistentFields must be compatible with" +
...@@ -554,6 +571,19 @@ outer: ...@@ -554,6 +571,19 @@ outer:
if (fields != null) if (fields != null)
{ {
Arrays.sort (fields); Arrays.sort (fields);
// Retrieve field reference.
for (int i=0; i < fields.length; i++)
{
try
{
fields[i].lookupField(cl);
}
catch (NoSuchFieldException _)
{
fields[i].setToSet(false);
}
}
calculateOffsets(); calculateOffsets();
return; return;
} }
...@@ -798,7 +828,7 @@ outer: ...@@ -798,7 +828,7 @@ outer:
fieldsArray = new ObjectStreamField[ o.length ]; fieldsArray = new ObjectStreamField[ o.length ];
System.arraycopy(o, 0, fieldsArray, 0, o.length); System.arraycopy(o, 0, fieldsArray, 0, o.length);
return fieldsArray; return fieldsArray;
} }
......
...@@ -41,6 +41,8 @@ package java.io; ...@@ -41,6 +41,8 @@ package java.io;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import gnu.java.lang.reflect.TypeSignature; import gnu.java.lang.reflect.TypeSignature;
import java.security.AccessController;
import java.security.PrivilegedAction;
/** /**
* This class intends to describe the field of a class for the serialization * This class intends to describe the field of a class for the serialization
...@@ -99,7 +101,7 @@ public class ObjectStreamField implements Comparable ...@@ -99,7 +101,7 @@ public class ObjectStreamField implements Comparable
/** /**
* There are many cases you can not get java.lang.Class from typename * There are many cases you can not get java.lang.Class from typename
* if your context class loader cann not load it, then use typename to * if your context class loader cannot load it, then use typename to
* construct the field. * construct the field.
* *
* @param name Name of the field to export. * @param name Name of the field to export.
...@@ -292,7 +294,7 @@ public class ObjectStreamField implements Comparable ...@@ -292,7 +294,7 @@ public class ObjectStreamField implements Comparable
} }
/** /**
* This methods returns true if the field is marked as to be * This method returns true if the field is marked as to be
* set. * set.
* *
* @return True if it is to be set, false in the other cases. * @return True if it is to be set, false in the other cases.
...@@ -303,6 +305,49 @@ public class ObjectStreamField implements Comparable ...@@ -303,6 +305,49 @@ public class ObjectStreamField implements Comparable
return toset; return toset;
} }
/**
* This method searches for its field reference in the specified class
* object. It requests privileges. If an error occurs the internal field
* reference is not modified.
*
* @throws NoSuchFieldException if the field name does not exist in this class.
* @throws SecurityException if there was an error requesting the privileges.
*/
void lookupField(Class clazz) throws NoSuchFieldException, SecurityException
{
final Field f = clazz.getDeclaredField(name);
AccessController.doPrivileged(new PrivilegedAction()
{
public Object run()
{
f.setAccessible(true);
return null;
}
});
this.field = f;
}
/**
* This method check whether the field described by this
* instance of ObjectStreamField is compatible with the
* actual implementation of this field.
*
* @throws NullPointerException if this field does not exist
* in the real class.
* @throws InvalidClassException if the types are incompatible.
*/
void checkFieldType() throws InvalidClassException
{
Class ftype = field.getType();
if (!ftype.isAssignableFrom(type))
throw new InvalidClassException
("invalid field type for " + name +
" in class " + field.getDeclaringClass());
}
public String toString () public String toString ()
{ {
return "ObjectStreamField< " + type + " " + name + " >"; return "ObjectStreamField< " + type + " " + name + " >";
...@@ -310,102 +355,102 @@ public class ObjectStreamField implements Comparable ...@@ -310,102 +355,102 @@ public class ObjectStreamField implements Comparable
final void setBooleanField(Object obj, boolean val) final void setBooleanField(Object obj, boolean val)
{ {
try try
{ {
field.setBoolean(obj, val); field.setBoolean(obj, val);
} }
catch(IllegalAccessException x) catch(IllegalAccessException x)
{ {
throw new InternalError(x.getMessage()); throw new InternalError(x.getMessage());
} }
} }
final void setByteField(Object obj, byte val) final void setByteField(Object obj, byte val)
{ {
try try
{ {
field.setByte(obj, val); field.setByte(obj, val);
} }
catch(IllegalAccessException x) catch(IllegalAccessException x)
{ {
throw new InternalError(x.getMessage()); throw new InternalError(x.getMessage());
} }
} }
final void setCharField(Object obj, char val) final void setCharField(Object obj, char val)
{ {
try try
{ {
field.setChar(obj, val); field.setChar(obj, val);
} }
catch(IllegalAccessException x) catch(IllegalAccessException x)
{ {
throw new InternalError(x.getMessage()); throw new InternalError(x.getMessage());
} }
} }
final void setShortField(Object obj, short val) final void setShortField(Object obj, short val)
{ {
try try
{ {
field.setShort(obj, val); field.setShort(obj, val);
} }
catch(IllegalAccessException x) catch(IllegalAccessException x)
{ {
throw new InternalError(x.getMessage()); throw new InternalError(x.getMessage());
} }
} }
final void setIntField(Object obj, int val) final void setIntField(Object obj, int val)
{ {
try try
{ {
field.setInt(obj, val); field.setInt(obj, val);
} }
catch(IllegalAccessException x) catch(IllegalAccessException x)
{ {
throw new InternalError(x.getMessage()); throw new InternalError(x.getMessage());
} }
} }
final void setLongField(Object obj, long val) final void setLongField(Object obj, long val)
{ {
try try
{ {
field.setLong(obj, val); field.setLong(obj, val);
} }
catch(IllegalAccessException x) catch(IllegalAccessException x)
{ {
throw new InternalError(x.getMessage()); throw new InternalError(x.getMessage());
} }
} }
final void setFloatField(Object obj, float val) final void setFloatField(Object obj, float val)
{ {
try try
{ {
field.setFloat(obj, val); field.setFloat(obj, val);
} }
catch(IllegalAccessException x) catch(IllegalAccessException x)
{ {
throw new InternalError(x.getMessage()); throw new InternalError(x.getMessage());
} }
} }
final void setDoubleField(Object obj, double val) final void setDoubleField(Object obj, double val)
{ {
try try
{ {
field.setDouble(obj, val); field.setDouble(obj, val);
} }
catch(IllegalAccessException x) catch(IllegalAccessException x)
{ {
throw new InternalError(x.getMessage()); throw new InternalError(x.getMessage());
} }
} }
final void setObjectField(Object obj, Object val) final void setObjectField(Object obj, Object val)
{ {
try try
{ {
field.set(obj, val); field.set(obj, val);
......
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