Tue, 19 May 2015 21:51:03 +0100
8068721: RMI-IIOP communication fails when ConcurrentHashMap is passed to remote method
Reviewed-by: chegar, alanb
1.1 --- a/src/share/classes/com/sun/corba/se/impl/io/IIOPInputStream.java Thu May 14 20:12:26 2015 -0700 1.2 +++ b/src/share/classes/com/sun/corba/se/impl/io/IIOPInputStream.java Tue May 19 21:51:03 2015 +0100 1.3 @@ -1,5 +1,5 @@ 1.4 /* 1.5 - * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. 1.6 + * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved. 1.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.8 * 1.9 * This code is free software; you can redistribute it and/or modify it 1.10 @@ -1768,43 +1768,59 @@ 1.11 switch (field.getTypeCode()) { 1.12 case 'B': 1.13 byte byteValue = orbStream.read_octet(); 1.14 - bridge.putByte( o, field.getFieldID(), byteValue ) ; 1.15 - //reflective code: field.getField().setByte( o, byteValue ) ; 1.16 + if (field.getField() != null) { 1.17 + bridge.putByte( o, field.getFieldID(), byteValue ) ; 1.18 + //reflective code: field.getField().setByte( o, byteValue ) ; 1.19 + } 1.20 break; 1.21 case 'Z': 1.22 boolean booleanValue = orbStream.read_boolean(); 1.23 - bridge.putBoolean( o, field.getFieldID(), booleanValue ) ; 1.24 - //reflective code: field.getField().setBoolean( o, booleanValue ) ; 1.25 + if (field.getField() != null) { 1.26 + bridge.putBoolean( o, field.getFieldID(), booleanValue ) ; 1.27 + //reflective code: field.getField().setBoolean( o, booleanValue ) ; 1.28 + } 1.29 break; 1.30 case 'C': 1.31 char charValue = orbStream.read_wchar(); 1.32 - bridge.putChar( o, field.getFieldID(), charValue ) ; 1.33 - //reflective code: field.getField().setChar( o, charValue ) ; 1.34 + if (field.getField() != null) { 1.35 + bridge.putChar( o, field.getFieldID(), charValue ) ; 1.36 + //reflective code: field.getField().setChar( o, charValue ) ; 1.37 + } 1.38 break; 1.39 case 'S': 1.40 short shortValue = orbStream.read_short(); 1.41 - bridge.putShort( o, field.getFieldID(), shortValue ) ; 1.42 - //reflective code: field.getField().setShort( o, shortValue ) ; 1.43 + if (field.getField() != null) { 1.44 + bridge.putShort( o, field.getFieldID(), shortValue ) ; 1.45 + //reflective code: field.getField().setShort( o, shortValue ) ; 1.46 + } 1.47 break; 1.48 case 'I': 1.49 int intValue = orbStream.read_long(); 1.50 - bridge.putInt( o, field.getFieldID(), intValue ) ; 1.51 - //reflective code: field.getField().setInt( o, intValue ) ; 1.52 + if (field.getField() != null) { 1.53 + bridge.putInt( o, field.getFieldID(), intValue ) ; 1.54 + //reflective code: field.getField().setInt( o, intValue ) ; 1.55 + } 1.56 break; 1.57 case 'J': 1.58 long longValue = orbStream.read_longlong(); 1.59 - bridge.putLong( o, field.getFieldID(), longValue ) ; 1.60 - //reflective code: field.getField().setLong( o, longValue ) ; 1.61 + if (field.getField() != null) { 1.62 + bridge.putLong( o, field.getFieldID(), longValue ) ; 1.63 + //reflective code: field.getField().setLong( o, longValue ) ; 1.64 + } 1.65 break; 1.66 case 'F' : 1.67 float floatValue = orbStream.read_float(); 1.68 - bridge.putFloat( o, field.getFieldID(), floatValue ) ; 1.69 - //reflective code: field.getField().setFloat( o, floatValue ) ; 1.70 + if (field.getField() != null) { 1.71 + bridge.putFloat( o, field.getFieldID(), floatValue ) ; 1.72 + //reflective code: field.getField().setFloat( o, floatValue ) ; 1.73 + } 1.74 break; 1.75 case 'D' : 1.76 double doubleValue = orbStream.read_double(); 1.77 - bridge.putDouble( o, field.getFieldID(), doubleValue ) ; 1.78 - //reflective code: field.getField().setDouble( o, doubleValue ) ; 1.79 + if (field.getField() != null) { 1.80 + bridge.putDouble( o, field.getFieldID(), doubleValue ) ; 1.81 + //reflective code: field.getField().setDouble( o, doubleValue ) ; 1.82 + } 1.83 break; 1.84 default: 1.85 // XXX I18N, logging needed. 1.86 @@ -2217,9 +2233,6 @@ 1.87 1.88 if (o != null) { 1.89 for (int i = 0; i < primFields; ++i) { 1.90 - if (fields[i].getField() == null) 1.91 - continue; 1.92 - 1.93 inputPrimitiveField(o, cl, fields[i]); 1.94 } 1.95 }
2.1 --- a/src/share/classes/com/sun/corba/se/impl/io/OutputStreamHook.java Thu May 14 20:12:26 2015 -0700 2.2 +++ b/src/share/classes/com/sun/corba/se/impl/io/OutputStreamHook.java Tue May 19 21:51:03 2015 +0100 2.3 @@ -1,5 +1,5 @@ 2.4 /* 2.5 - * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. 2.6 + * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. 2.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 2.8 * 2.9 * This code is free software; you can redistribute it and/or modify it 2.10 @@ -32,6 +32,7 @@ 2.11 package com.sun.corba.se.impl.io; 2.12 2.13 import java.io.IOException; 2.14 +import java.io.NotActiveException; 2.15 import java.io.OutputStream; 2.16 import java.io.ObjectOutputStream; 2.17 import java.io.ObjectOutput; 2.18 @@ -154,7 +155,9 @@ 2.19 2.20 public ObjectOutputStream.PutField putFields() 2.21 throws IOException { 2.22 - putFields = new HookPutFields(); 2.23 + if (putFields == null) { 2.24 + putFields = new HookPutFields(); 2.25 + } 2.26 return putFields; 2.27 } 2.28 2.29 @@ -175,8 +178,11 @@ 2.30 throws IOException { 2.31 2.32 writeObjectState.defaultWriteObject(this); 2.33 - 2.34 - putFields.write(this); 2.35 + if (putFields != null) { 2.36 + putFields.write(this); 2.37 + } else { 2.38 + throw new NotActiveException("no current PutField object"); 2.39 + } 2.40 } 2.41 2.42 abstract org.omg.CORBA_2_3.portable.OutputStream getOrbStream();