[ https://issues.apache.org/jira/browse/WICKET-6531?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Martin Tzvetanov Grigorov reassigned WICKET-6531: ------------------------------------------------- Assignee: Martin Tzvetanov Grigorov > Crash in Unsafe.getObject when running on the J9 VM > --------------------------------------------------- > > Key: WICKET-6531 > URL: https://issues.apache.org/jira/browse/WICKET-6531 > Project: Wicket > Issue Type: Bug > Components: wicket > Affects Versions: 7.9.0, 8.0.0-M8 > Environment: J9 VM (Java7) on AIX > Reporter: Kevin Langman > Assignee: Martin Tzvetanov Grigorov > Priority: Major > > The CheckingObjectOutputStream class is using introspection of JVM internals > to load object fields and array elements during serialization. This is a > risky business given that there is no guarantee that all JVM implementations > will implement the serialization internals in the same way. For the crash I > am reporting here, we are checking an object that extends BigDecimal, but the > J9 VM has its own implementation of BigDecimal and therefore has special > handling of BigDecimal serialization so that it can (for compatibility > reasons) mimic the byte-stream that would be produced by OpenJDK. This > results in the CheckingObjectOutputStream code attempting to read fields out > of an object that does not actually exist in the object, but only reflects > the fields that will be written out to the serialization byte-stream. > > In CheckingObjectOutputStream.checkFields() there is code to prevent checking > objects that are instances of String, Number, Date, Boolean and Class. If > this check was also done prior to checking array elements in internalCheck() > then the the crash I am reporting here would not have occurred and therefore > I am proposing that we add the following 'if statement' into the code: > > CheckingObjectOutputStream.internalCheck() – Line 394: > for (int i = 0; i < objs.length; i++) > { > *if (objs[i] instanceof String || objs[i] instanceof Number ||* > *objs[i] instanceof Date || objs[i] instanceof Boolean ||* > *objs[i] instanceof Class)* > *{* > *// filter out common cases* > *}else{* > CharSequence arrayPos = new > StringBuilder(4).append('[').append(i).append(']'); > simpleName = arrayPos; > fieldDescription += arrayPos; > check(objs[i]); > *}* > } > -- This message was sent by Atlassian Jira (v8.3.4#803005)