summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2012-07-26 22:56:11 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2012-07-26 22:56:11 -0700
commitc4bfd09c1477dd1a8adbb4ad15d668c324a3e303 (patch)
treef1c8d683cb18d41e35a254be6b95d1142f84dd11
parent510f1fd5bfb60dd60dd8a4206c466ff341faa63c (diff)
parent0a59916879540867cc144399b902f9a31375e72b (diff)
downloadlibcore-c4bfd09c1477dd1a8adbb4ad15d668c324a3e303.zip
libcore-c4bfd09c1477dd1a8adbb4ad15d668c324a3e303.tar.gz
libcore-c4bfd09c1477dd1a8adbb4ad15d668c324a3e303.tar.bz2
am 0a599168: am fcf37613: am 88a5c75f: Merge "Fix deserialization of transient fields."
* commit '0a59916879540867cc144399b902f9a31375e72b': Fix deserialization of transient fields.
-rw-r--r--luni/src/main/java/java/io/ObjectInputStream.java8
-rw-r--r--luni/src/main/java/java/io/ObjectStreamClass.java8
-rw-r--r--luni/src/test/java/libcore/java/io/SerializationTest.java10
3 files changed, 19 insertions, 7 deletions
diff --git a/luni/src/main/java/java/io/ObjectInputStream.java b/luni/src/main/java/java/io/ObjectInputStream.java
index 4541f1b..acf00af 100644
--- a/luni/src/main/java/java/io/ObjectInputStream.java
+++ b/luni/src/main/java/java/io/ObjectInputStream.java
@@ -23,6 +23,7 @@ import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
import java.lang.reflect.Proxy;
import java.security.PrivilegedAction;
import java.util.ArrayList;
@@ -1089,8 +1090,11 @@ public class ObjectInputStream extends InputStream implements ObjectInput, Objec
for (ObjectStreamField fieldDesc : fields) {
Field field = classDesc.getReflectionField(fieldDesc);
- // We may not have been able to find the field, but we still need to read the value
- // and do the other checking, so there's no null check on 'field' here.
+ if (Modifier.isTransient(field.getModifiers())) {
+ field = null; // No setting transient fields! (http://b/4471249)
+ }
+ // We may not have been able to find the field, or it may be transient, but we still
+ // need to read the value and do the other checking...
try {
Class<?> type = fieldDesc.getTypeInternal();
if (type == byte.class) {
diff --git a/luni/src/main/java/java/io/ObjectStreamClass.java b/luni/src/main/java/java/io/ObjectStreamClass.java
index e87fcd4..a28489a 100644
--- a/luni/src/main/java/java/io/ObjectStreamClass.java
+++ b/luni/src/main/java/java/io/ObjectStreamClass.java
@@ -481,16 +481,14 @@ public class ObjectStreamClass implements Serializable {
Field field = fields[i];
int modifiers = field.getModifiers() & FIELD_MODIFIERS_MASK;
- boolean skip = Modifier.isPrivate(modifiers)
- && (Modifier.isTransient(modifiers) || Modifier
- .isStatic(modifiers));
+ boolean skip = Modifier.isPrivate(modifiers) &&
+ (Modifier.isTransient(modifiers) || Modifier.isStatic(modifiers));
if (!skip) {
// write name, modifier & "descriptor" of all but private
// static and private transient
output.writeUTF(field.getName());
output.writeInt(modifiers);
- output
- .writeUTF(descriptorForFieldSignature(getFieldSignature(field)));
+ output.writeUTF(descriptorForFieldSignature(getFieldSignature(field)));
}
}
diff --git a/luni/src/test/java/libcore/java/io/SerializationTest.java b/luni/src/test/java/libcore/java/io/SerializationTest.java
index 434dd56..d452c11 100644
--- a/luni/src/test/java/libcore/java/io/SerializationTest.java
+++ b/luni/src/test/java/libcore/java/io/SerializationTest.java
@@ -18,6 +18,8 @@ package libcore.java.io;
import java.io.IOException;
import java.io.InvalidClassException;
+import java.io.ObjectStreamClass;
+import java.io.ObjectStreamField;
import java.io.Serializable;
import junit.framework.TestCase;
import libcore.util.SerializationTester;
@@ -26,6 +28,13 @@ public final class SerializationTest extends TestCase {
// http://b/4471249
public void testSerializeFieldMadeTransient() throws Exception {
+ // Does ObjectStreamClass have the right idea?
+ ObjectStreamClass osc = ObjectStreamClass.lookup(FieldMadeTransient.class);
+ ObjectStreamField[] fields = osc.getFields();
+ assertEquals(1, fields.length);
+ assertEquals("nonTransientInt", fields[0].getName());
+ assertEquals(int.class, fields[0].getType());
+
// this was created by serializing a FieldMadeTransient with a non-0 transientInt
String s = "aced0005737200346c6962636f72652e6a6176612e696f2e53657269616c697a6174696f6e54657"
+ "374244669656c644d6164655472616e7369656e74000000000000000002000149000c7472616e736"
@@ -37,6 +46,7 @@ public final class SerializationTest extends TestCase {
static class FieldMadeTransient implements Serializable {
private static final long serialVersionUID = 0L;
private transient int transientInt;
+ private int nonTransientInt;
}
public void testSerialVersionUidChange() throws Exception {