[ 
https://issues.apache.org/jira/browse/OPENJPA-385?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Kevin Sutter updated OPENJPA-385:
---------------------------------

    Attachment: OPENJPA-385.patch

Updated version of the patch.

> IndexOutOfBounds exception when parsing ".class" files
> ------------------------------------------------------
>
>                 Key: OPENJPA-385
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-385
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: lib
>    Affects Versions: 1.0.0, 1.0.1, 1.1.0
>            Reporter: Kevin Sutter
>            Assignee: Kevin Sutter
>             Fix For: 1.0.1, 1.1.0
>
>         Attachments: OPENJPA-385.patch, OPENJPA-385.patch
>
>
> When finding and parsing files via the classpath, we're hitting a situation 
> where an invalid .class file is in the classpath.  Although the files in 
> question have the .class suffix, they do not have valid .class format.  Not 
> only are we blowing up via the serp utilities, but neither jad nor javap can 
> recognize the files either.  Here's the call stack that is produced:
> Exception in thread "main" java.lang.ClassFormatError: 
> COM/ibm/db2os390/sqlj/custom/DB2SQLJCustomizer.class
>         at 
> org.apache.openjpa.lib.meta.ClassAnnotationMetaDataFilter.matches(ClassAnnotationMetaDataFilter.java:89)
>         at 
> org.apache.openjpa.lib.meta.ZipFileMetaDataIterator.hasNext(ZipFileMetaDataIterator.java:79)
>         at 
> org.apache.openjpa.lib.meta.MetaDataIteratorChain.hasNext(MetaDataIteratorChain.java:76)
>         at 
> org.apache.openjpa.lib.meta.ClassArgParser.mapTypeNames(ClassArgParser.java:277)
>         at 
> org.apache.openjpa.meta.AbstractCFMetaDataFactory.scan(AbstractCFMetaDataFactory.java:713)
>         at 
> org.apache.openjpa.meta.AbstractCFMetaDataFactory.getPersistentTypeNames(AbstractCFMetaDataFactory.java:583)
>         at 
> org.apache.openjpa.meta.MetaDataRepository.getPersistentTypeNames(MetaDataRepository.java:1190)
>         at 
> org.apache.openjpa.meta.MetaDataRepository.loadPersistentTypes(MetaDataRepository.java:1207)
>         at org.apache.openjpa.jdbc.meta.MappingTool.run(MappingTool.java:1002)
>         at org.apache.openjpa.jdbc.meta.MappingTool.run(MappingTool.java:977)
>         at org.apache.openjpa.jdbc.meta.MappingTool.main(MappingTool.java:918)
> Caused by: java.lang.ArrayIndexOutOfBoundsException
>         at 
> serp.bytecode.lowlevel.ConstantPoolTable.readByte(ConstantPoolTable.java:106)
>         at 
> serp.bytecode.lowlevel.ConstantPoolTable.readUnsignedShort(ConstantPoolTable.java:114)
>         at 
> serp.bytecode.lowlevel.ConstantPoolTable.readUnsignedShort(ConstantPoolTable.java:184)
>         at 
> org.apache.openjpa.lib.meta.ClassAnnotationMetaDataFilter.matches(ClassAnnotationMetaDataFilter.java:67)
>         ... 10 more
> As you can see, the file in question is actually coming from the db2jcc.jar.  
> Although I could pursue why these files do not have the correct format, I'm 
> proposing that we become more lenient in our "matches" logic.  Right now, we 
> are throwing this IOOB exception.  This seems too harsh, especially since we 
> just return "false" for any other indication that the resource is not an 
> "interesting" class file with appropriate annotations.  In my mind, this 
> invalid class file should just be treated as if it didn't have the .class 
> suffix.
> So, instead of the current exception throwing processing, I would like to 
> change to just log a trace message.  We already log an Info message for all 
> of the files that we do process.  And, logging an info message for a bad 
> class format might just cause confusion (much like this exception throwing).  
> Thus, I would like to just log a trace message with the appropriate 
> information and return "false" on this matches() invocation.
> Any problems with this approach?  I've looked at the caller's of this method 
> and nobody is expecting to get the ClassFormatException or IOOB exception 
> (unexpected runtime exception), so just logging and eating the exception and 
> returning false looks safe.
> Kevin

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to