This commit is contained in:
Lana Steuck 2016-06-23 21:12:51 +00:00
commit 8f7f362c13

View File

@ -2230,7 +2230,7 @@ public class IIOPInputStream
* REVISIT -- This code doesn't do what the comment says to when
* getField() is null!
*/
private void inputClassFields(Object o, Class cl,
private void inputClassFields(Object o, Class<?> cl,
ObjectStreamField[] fields,
com.sun.org.omg.SendingContext.CodeBase sender)
throws InvalidClassException, StreamCorruptedException,
@ -2239,6 +2239,8 @@ public class IIOPInputStream
int primFields = fields.length - currentClassDesc.objFields;
// this will leave primitives in the inputstream
// should really consume and discard where necessary
if (o != null) {
for (int i = 0; i < primFields; ++i) {
inputPrimitiveField(o, cl, fields[i]);
@ -2264,21 +2266,32 @@ public class IIOPInputStream
}
try {
Class fieldCl = fields[i].getClazz();
Class<?> fieldCl = fields[i].getClazz();
if ((objectValue != null)
&& (!fieldCl.isAssignableFrom(
objectValue.getClass()))) {
throw new IllegalArgumentException("Field mismatch");
}
Field classField = null;
Field declaredClassField = null;
final String inputStreamFieldName = fields[i].getName();
try {
classField = cl.getDeclaredField(fields[i].getName());
} catch (NoSuchFieldException nsfEx) {
throw new IllegalArgumentException(nsfEx);
declaredClassField = getDeclaredField( cl, inputStreamFieldName);
} catch (PrivilegedActionException paEx) {
throw new IllegalArgumentException(
(NoSuchFieldException) paEx.getException());
} catch (SecurityException secEx) {
throw new IllegalArgumentException(secEx.getCause());
throw new IllegalArgumentException(secEx);
} catch (NullPointerException npEx) {
continue;
} catch (NoSuchFieldException e) {
continue;
}
Class<?> declaredFieldClass = classField.getType();
if (declaredClassField == null) {
continue;
}
Class<?> declaredFieldClass = declaredClassField.getType();
// check input field type is a declared field type
// input field is a subclass of the declared field
@ -2291,15 +2304,24 @@ public class IIOPInputStream
}
bridge.putObject( o, fields[i].getFieldID(), objectValue ) ;
// reflective code: fields[i].getField().set( o, objectValue ) ;
} catch (IllegalArgumentException e) {
ClassCastException exc = new ClassCastException("Assigning instance of class " +
objectValue.getClass().getName() +
" to field " +
currentClassDesc.getName() +
'#' +
fields[i].getField().getName());
exc.initCause( e ) ;
throw exc ;
} catch (IllegalArgumentException iaEx) {
String objectValueClassName = "null";
String currentClassDescClassName = "null";
String fieldName = "null";
if (objectValue != null) {
objectValueClassName = objectValue.getClass().getName();
}
if (currentClassDesc != null) {
currentClassDescClassName = currentClassDesc.getName();
}
if (fields[i] != null && fields[i].getField() != null) {
fieldName = fields[i].getField().getName();
}
ClassCastException ccEx = new ClassCastException(
"Assigning instance of class " + objectValueClassName
+ " to field " + currentClassDescClassName + '#' + fieldName);
ccEx.initCause( iaEx ) ;
throw ccEx ;
}
} // end : for loop
}
@ -2592,12 +2614,11 @@ public class IIOPInputStream
throw cce ;
}
}
}
private static void setObjectField(Object o, Class c, String fieldName, Object v) {
private static void setObjectField(Object o, Class<?> c, String fieldName, Object v) {
try {
Field fld = c.getDeclaredField( fieldName ) ;
Field fld = getDeclaredField( c, fieldName ) ;
Class fieldCl = fld.getType();
if(v != null && !fieldCl.isInstance(v)) {
throw new Exception();
@ -2617,10 +2638,10 @@ public class IIOPInputStream
}
}
private static void setBooleanField(Object o, Class c, String fieldName, boolean v)
private static void setBooleanField(Object o, Class<?> c, String fieldName, boolean v)
{
try {
Field fld = c.getDeclaredField( fieldName ) ;
Field fld = getDeclaredField( c, fieldName ) ;
if ((fld != null) && (fld.getType() == Boolean.TYPE)) {
long key = bridge.objectFieldOffset( fld ) ;
bridge.putBoolean( o, key, v ) ;
@ -2640,10 +2661,10 @@ public class IIOPInputStream
}
}
private static void setByteField(Object o, Class c, String fieldName, byte v)
private static void setByteField(Object o, Class<?> c, String fieldName, byte v)
{
try {
Field fld = c.getDeclaredField( fieldName ) ;
Field fld = getDeclaredField( c, fieldName ) ;
if ((fld != null) && (fld.getType() == Byte.TYPE)) {
long key = bridge.objectFieldOffset( fld ) ;
bridge.putByte( o, key, v ) ;
@ -2663,10 +2684,10 @@ public class IIOPInputStream
}
}
private static void setCharField(Object o, Class c, String fieldName, char v)
private static void setCharField(Object o, Class<?> c, String fieldName, char v)
{
try {
Field fld = c.getDeclaredField( fieldName ) ;
Field fld = getDeclaredField( c, fieldName ) ;
if ((fld != null) && (fld.getType() == Character.TYPE)) {
long key = bridge.objectFieldOffset( fld ) ;
bridge.putChar( o, key, v ) ;
@ -2686,10 +2707,10 @@ public class IIOPInputStream
}
}
private static void setShortField(Object o, Class c, String fieldName, short v)
private static void setShortField(Object o, Class<?> c, String fieldName, short v)
{
try {
Field fld = c.getDeclaredField( fieldName ) ;
Field fld = getDeclaredField( c, fieldName ) ;
if ((fld != null) && (fld.getType() == Short.TYPE)) {
long key = bridge.objectFieldOffset( fld ) ;
bridge.putShort( o, key, v ) ;
@ -2709,10 +2730,10 @@ public class IIOPInputStream
}
}
private static void setIntField(Object o, Class c, String fieldName, int v)
private static void setIntField(Object o, Class<?> c, String fieldName, int v)
{
try {
Field fld = c.getDeclaredField( fieldName ) ;
Field fld = getDeclaredField( c, fieldName ) ;
if ((fld != null) && (fld.getType() == Integer.TYPE)) {
long key = bridge.objectFieldOffset( fld ) ;
bridge.putInt( o, key, v ) ;
@ -2732,10 +2753,10 @@ public class IIOPInputStream
}
}
private static void setLongField(Object o, Class c, String fieldName, long v)
private static void setLongField(Object o, Class<?> c, String fieldName, long v)
{
try {
Field fld = c.getDeclaredField( fieldName ) ;
Field fld = getDeclaredField( c, fieldName ) ;
if ((fld != null) && (fld.getType() == Long.TYPE)) {
long key = bridge.objectFieldOffset( fld ) ;
bridge.putLong( o, key, v ) ;
@ -2755,10 +2776,10 @@ public class IIOPInputStream
}
}
private static void setFloatField(Object o, Class c, String fieldName, float v)
private static void setFloatField(Object o, Class<?> c, String fieldName, float v)
{
try {
Field fld = c.getDeclaredField( fieldName ) ;
Field fld = getDeclaredField( c, fieldName ) ;
if ((fld != null) && (fld.getType() == Float.TYPE)) {
long key = bridge.objectFieldOffset( fld ) ;
bridge.putFloat( o, key, v ) ;
@ -2778,10 +2799,10 @@ public class IIOPInputStream
}
}
private static void setDoubleField(Object o, Class c, String fieldName, double v)
private static void setDoubleField(Object o, Class<?> c, String fieldName, double v)
{
try {
Field fld = c.getDeclaredField( fieldName ) ;
Field fld = getDeclaredField( c, fieldName ) ;
if ((fld != null) && (fld.getType() == Double.TYPE)) {
long key = bridge.objectFieldOffset( fld ) ;
bridge.putDouble( o, key, v ) ;
@ -2801,6 +2822,22 @@ public class IIOPInputStream
}
}
private static Field getDeclaredField(final Class<?> c,
final String fieldName)
throws PrivilegedActionException, NoSuchFieldException, SecurityException {
if (System.getSecurityManager() == null) {
return c.getDeclaredField(fieldName);
} else {
return AccessController
.doPrivileged(new PrivilegedExceptionAction<Field>() {
public Field run() throws NoSuchFieldException {
return c.getDeclaredField(fieldName);
}
});
}
}
/**
* This class maintains a map of stream position to
* an Object currently being deserialized. It is used
@ -2811,12 +2848,12 @@ public class IIOPInputStream
*/
static class ActiveRecursionManager
{
private Map offsetToObjectMap;
private Map<Integer, Object> offsetToObjectMap;
public ActiveRecursionManager() {
// A hash map is unsynchronized and allows
// null values
offsetToObjectMap = new HashMap();
offsetToObjectMap = new HashMap<>();
}
// Called right after allocating a new object.