Hello.
Please review the fix for jdk9.

Short description:
XMLEncoder incorrectly reference a non-static fields, when these fields were assigned to some other fields.
The bug was uncovered by some existing tests after the fix for [1].

Long description:

The next code is serialized incorrectly:
    public static final class Test {
        public Integer integer_10_default = new Integer(10);
public Integer integer_10_set1; // will be set to the same as default
    }

Result:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.9.0-internal" class="java.beans.XMLDecoder">
 <object class="FieldsEncode$Test" id="FieldsEncode$Test0">
  <void class="FieldsEncode$Test" method="getField">
   <string>integer_10_set1</string>
   <void method="set">
    <object idref="FieldsEncode$Test0"/>
    <object class="FieldsEncode$Test" field="integer_10_default"/>
   </void>
  </void>
 </object>
</java>

Note that the encoder reference to the integer_10_default as a static field. So when the decoder will try to load it, it will fail:

java.lang.NoSuchFieldException: Field 'integer_10_default' is not static
at com.sun.beans.finder.FieldFinder.findStaticField(FieldFinder.java:99) at com.sun.beans.decoder.FieldElementHandler.findField(FieldElementHandler.java:186) at com.sun.beans.decoder.FieldElementHandler.getFieldValue(FieldElementHandler.java:158) at com.sun.beans.decoder.ObjectElementHandler.getValueObject(ObjectElementHandler.java:141) at com.sun.beans.decoder.NewElementHandler.getValueObject(NewElementHandler.java:123) at com.sun.beans.decoder.ObjectElementHandler.startElement(ObjectElementHandler.java:113) at com.sun.beans.decoder.DocumentHandler.startElement(DocumentHandler.java:300)

After the fix we will use "<object class=" only for static field, and resulted xml will be:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.9.0-internal" class="java.beans.XMLDecoder">
 <object class="FieldsEncode$Test" id="FieldsEncode$Test0">
  <void class="FieldsEncode$Test" method="getField">
   <string>integer_10_set1</string>
   <void method="set">
    <object idref="FieldsEncode$Test0"/>
    <void class="FieldsEncode$Test" id="Field0" method="getField">
     <string>integer_10_default</string>
     <void id="Integer0" method="get">
      <object idref="FieldsEncode$Test0"/>
     </void>
    </void>
    <object idref="Integer0"/>
   </void>
  </void>
 </object>
</java>

Note that in this case we will access the integer_10_default using getField.

The new test which covers this issue in general is provided.

Bug: https://bugs.openjdk.java.net/browse/JDK-8060027
Webrev can be found at: http://cr.openjdk.java.net/~serb/8060027/webrev.00

[1]https://bugs.openjdk.java.net/browse/JDK-5043030

--
Best regards, Sergey.

Reply via email to