aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/io/ObjectStreamClass.java
diff options
context:
space:
mode:
authorGuilhem Lavaux <guilhem@kaffe.org>2003-12-23 22:06:01 +0000
committerMichael Koch <mkoch@gcc.gnu.org>2003-12-23 22:06:01 +0000
commit692fb023ef14a4690ee766c0596306353175aeec (patch)
treecf9911a00c5d1b39db4f88ffc6c7f626cad43bf9 /libjava/java/io/ObjectStreamClass.java
parentf2073745a81b0687b24f40c1549769be5917987f (diff)
downloadgcc-692fb023ef14a4690ee766c0596306353175aeec.zip
gcc-692fb023ef14a4690ee766c0596306353175aeec.tar.gz
gcc-692fb023ef14a4690ee766c0596306353175aeec.tar.bz2
2003-12-23 Guilhem Lavaux <guilhem@kaffe.org>
* java/io/ObjectInputStream.java (getField): Handle transient and non persistent fields. (readClassDescriptor): Better error handling, use the right class loader. (readFields): Fields marked as not present in the stream or not to be set are not read and set. * java/io/ObjectInputStream.java (readFields): Changed implementation of GetField. (readClassDescriptor): Documented. * java/io/ObjectOutputStream.java (writeClassDescriptor): Added condition when to write class super class information. From-SVN: r74985
Diffstat (limited to 'libjava/java/io/ObjectStreamClass.java')
-rw-r--r--libjava/java/io/ObjectStreamClass.java40
1 files changed, 34 insertions, 6 deletions
diff --git a/libjava/java/io/ObjectStreamClass.java b/libjava/java/io/ObjectStreamClass.java
index 0be9a7e..9d9d99d 100644
--- a/libjava/java/io/ObjectStreamClass.java
+++ b/libjava/java/io/ObjectStreamClass.java
@@ -516,9 +516,12 @@ public class ObjectStreamClass implements Serializable
&& Modifier.isPrivate (modifiers))
{
fields = getSerialPersistentFields (cl);
- Arrays.sort (fields);
- calculateOffsets ();
- return;
+ if (fields != null)
+ {
+ Arrays.sort(fields);
+ calculateOffsets();
+ return;
+ }
}
}
catch (NoSuchFieldException ignore)
@@ -700,16 +703,41 @@ public class ObjectStreamClass implements Serializable
}
}
- // Returns the value of CLAZZ's private static final field named
- // `serialPersistentFields'.
+ /**
+ * Returns the value of CLAZZ's private static final field named
+ * `serialPersistentFields'. It performs some sanity checks before
+ * returning the real array. Besides, the returned array is a clean
+ * copy of the original. So it can be modified.
+ *
+ * @param clazz Class to retrieve 'serialPersistentFields' from.
+ * @return The content of 'serialPersistentFields'.
+ */
private ObjectStreamField[] getSerialPersistentFields (Class clazz)
throws NoSuchFieldException, IllegalAccessException
{
+ ObjectStreamField[] fieldsArray = null;
+ ObjectStreamField[] o;
+
// Use getDeclaredField rather than getField for the same reason
// as above in getDefinedSUID.
Field f = clazz.getDeclaredField("serialPersistentFields");
f.setAccessible(true);
- return (ObjectStreamField[]) f.get(null);
+
+ int modifiers = f.getModifiers();
+ if (!(Modifier.isStatic(modifiers)
+ && Modifier.isFinal(modifiers)
+ && Modifier.isPrivate(modifiers)))
+ return null;
+
+ o = (ObjectStreamField[]) f.get(null);
+
+ if (o == null)
+ return null;
+
+ fieldsArray = new ObjectStreamField[o.length];
+ System.arraycopy(o, 0, fieldsArray, 0, o.length);
+
+ return fieldsArray;
}
public static final ObjectStreamField[] NO_FIELDS = {};