You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2006/08/08 23:33:22 UTC
svn commit: r429827 - in
/incubator/harmony/enhanced/classlib/trunk/modules/luni/src:
main/java/java/io/ main/java/org/apache/harmony/luni/util/
test/api/java/org/apache/harmony/luni/tests/java/io/
Author: tellison
Date: Tue Aug 8 14:33:21 2006
New Revision: 429827
URL: http://svn.apache.org/viewvc?rev=429827&view=rev
Log:
Apply patch HARMONY-819 (serialization: ObjectInputStream.readObject() doesn't throw expected exception after readUnshared())
and regression testcase.
Modified:
incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectInputStream.java
incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/ExternalMessages.properties
incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/api/java/org/apache/harmony/luni/tests/java/io/ObjectInputStreamTest.java
Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectInputStream.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectInputStream.java?rev=429827&r1=429826&r2=429827&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectInputStream.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/ObjectInputStream.java Tue Aug 8 14:33:21 2006
@@ -49,6 +49,9 @@
private static InputStream emptyStream = new ByteArrayInputStream(
new byte[0]);
+ // To put into objectsRead when reading unsharedObject
+ private static final Object UNSHARED_OBJ = new Object();
+
// If the receiver has already read & not consumed a TC code
private boolean hasPushbackTC;
@@ -685,7 +688,7 @@
ObjectStreamClass streamClass = ObjectStreamClass
.lookup(proxyClass);
streamClass.setLoadFields(new ObjectStreamField[0]);
- registerObjectRead(streamClass, new Integer(nextHandle()));
+ registerObjectRead(streamClass, new Integer(nextHandle()), false);
streamClass.setSuperclass(readClassDesc());
return streamClass;
case TC_REFERENCE:
@@ -1411,9 +1414,8 @@
Class<?> arrayClass = classDesc.forClass();
Class<?> componentType = arrayClass.getComponentType();
Object result = Array.newInstance(componentType, size);
- if (!unshared) {
- registerObjectRead(result, newHandle);
- }
+
+ registerObjectRead(result, newHandle, unshared);
// Now we have code duplication just because Java is typed. We have to
// read N elements and assign to array positions, but we must typecast
@@ -1462,7 +1464,7 @@
}
if (enableResolve) {
result = resolveObject(result);
- registerObjectRead(result, newHandle);
+ registerObjectRead(result, newHandle, false);
}
return result;
}
@@ -1487,8 +1489,8 @@
if (classDesc != null) {
Integer newHandle = new Integer(nextHandle());
Class<?> localClass = classDesc.forClass();
- if (localClass != null && !unshared)
- registerObjectRead(localClass, newHandle);
+ if (localClass != null)
+ registerObjectRead(localClass, newHandle, unshared);
return localClass;
}
throw new InvalidClassException(Msg.getString("K00d1")); //$NON-NLS-1$
@@ -1511,7 +1513,7 @@
descriptorHandle = new Integer(nextHandle());
classDesc = readClassDescriptor();
if (descriptorHandle != null) {
- registerObjectRead(classDesc, descriptorHandle);
+ registerObjectRead(classDesc, descriptorHandle, false);
}
descriptorHandle = oldHandle;
primitiveData = emptyStream;
@@ -1563,9 +1565,8 @@
}
Enum result = Enum.valueOf((Class)classDesc.forClass(), name);
- if (!unshared) {
- registerObjectRead(result, newHandle);
- }
+ registerObjectRead(result, newHandle, unshared);
+
return result;
}
@@ -1592,8 +1593,8 @@
Integer oldHandle = descriptorHandle;
descriptorHandle = new Integer(nextHandle());
ObjectStreamClass newClassDesc = readClassDescriptor();
- if (descriptorHandle != null && !unshared) {
- registerObjectRead(newClassDesc, descriptorHandle);
+ if (descriptorHandle != null) {
+ registerObjectRead(newClassDesc, descriptorHandle, unshared);
}
descriptorHandle = oldHandle;
primitiveData = emptyStream;
@@ -1673,7 +1674,7 @@
// We must register the class descriptor before reading field
// descriptors.
- registerObjectRead(newClassDesc, descriptorHandle);
+ registerObjectRead(newClassDesc, descriptorHandle, false);
descriptorHandle = null;
readFieldDescriptors(newClassDesc);
@@ -1819,9 +1820,8 @@
// Now we know which class to instantiate and which constructor to
// run. We are allowed to run the constructor.
result = newInstance(objectClass, constructorClass);
- if (!unshared) {
- registerObjectRead(result, newHandle);
- }
+ registerObjectRead(result, newHandle, unshared);
+
registeredResult = result;
} else {
result = null;
@@ -1905,8 +1905,8 @@
// it
if (result != null && enableResolve)
result = resolveObject(result);
- if (registeredResult != result && !unshared) {
- registerObjectRead(result, newHandle);
+ if (registeredResult != result) {
+ registerObjectRead(result, newHandle, unshared);
}
return result;
}
@@ -1927,9 +1927,8 @@
if (enableResolve)
result = resolveObject(result);
int newHandle = nextHandle();
- if (!unshared) {
- registerObjectRead(result, new Integer(newHandle));
- }
+ registerObjectRead(result, new Integer(newHandle), unshared);
+
return result;
}
@@ -1950,9 +1949,8 @@
if (enableResolve)
result = resolveObject(result);
int newHandle = nextHandle();
- if (!unshared) {
- registerObjectRead(result, new Integer(newHandle));
- }
+ registerObjectRead(result, new Integer(newHandle), unshared);
+
return result;
}
@@ -2156,7 +2154,12 @@
*/
private Object registeredObjectRead(Integer handle)
throws InvalidObjectException {
- return objectsRead.get(handle);
+ Object res = objectsRead.get(handle);
+
+ if (res == UNSHARED_OBJ)
+ throw new InvalidObjectException(Msg.getString("KA010")); //$NON-NLS-1$
+
+ return res;
}
/**
@@ -2167,11 +2170,13 @@
* Non-null object being loaded.
* @param handle
* An Integer, the handle to this object
+ * @param unshared
+ * Boolean, indicates that caller is reading in unshared mode
*
* @see #nextHandle
*/
- private void registerObjectRead(Object obj, Integer handle) {
- objectsRead.put(handle, obj);
+ private void registerObjectRead(Object obj, Integer handle, boolean unshared) {
+ objectsRead.put(handle, unshared ? UNSHARED_OBJ : obj);
}
/**
Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/ExternalMessages.properties
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/ExternalMessages.properties?rev=429827&r1=429826&r2=429827&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/ExternalMessages.properties (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/org/apache/harmony/luni/util/ExternalMessages.properties Tue Aug 8 14:33:21 2006
@@ -301,3 +301,4 @@
KA00d=ReadableByteChannel is null
KA00e=Radix {0} is less than Character.MIN_RADIX or greater than Character.MAX_RADIX
KA00f=Socket output is shutdown
+KA010=Cannot read back reference to unshared object
Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/api/java/org/apache/harmony/luni/tests/java/io/ObjectInputStreamTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/api/java/org/apache/harmony/luni/tests/java/io/ObjectInputStreamTest.java?rev=429827&r1=429826&r2=429827&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/api/java/org/apache/harmony/luni/tests/java/io/ObjectInputStreamTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/api/java/org/apache/harmony/luni/tests/java/io/ObjectInputStreamTest.java Tue Aug 8 14:33:21 2006
@@ -19,14 +19,36 @@
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
+import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import java.io.ObjectStreamException;
import java.io.Serializable;
import java.util.ArrayList;
import junit.framework.TestCase;
public class ObjectInputStreamTest extends TestCase {
+
+ public void test_readUnshared() throws IOException, ClassNotFoundException {
+ // Regression test for HARMONY-819
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ try {
+ ObjectOutputStream oos = new ObjectOutputStream(baos);
+ oos.writeObject("abc");
+ oos.writeObject("abc");
+ oos.close();
+
+ ObjectInputStream ois = new ObjectInputStream(
+ new ByteArrayInputStream(baos.toByteArray()));
+ ois.readUnshared();
+ ois.readObject();
+ ois.close();
+ fail("Expected ObjectStreamException");
+ } catch (ObjectStreamException e) {
+ // expected
+ }
+ }
/**
* Micro-scenario of de/serialization of an object with non-serializable superclass.