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

Leonardo Uribe updated MYFACES-2930:
------------------------------------

       Resolution: Fixed
    Fix Version/s: 2.0.3-SNAPSHOT
         Assignee: Leonardo Uribe
           Status: Resolved  (was: Patch Available)

Thanks to Christian Kaltepoth for provide this patch

> ClassByteCodeAnnotationFilter doesn't read the constants pool correctly
> -----------------------------------------------------------------------
>
>                 Key: MYFACES-2930
>                 URL: https://issues.apache.org/jira/browse/MYFACES-2930
>             Project: MyFaces Core
>          Issue Type: Bug
>          Components: General
>    Affects Versions: 2.0.3-SNAPSHOT
>            Reporter: Christian Kaltepoth
>            Assignee: Leonardo Uribe
>            Priority: Minor
>             Fix For: 2.0.3-SNAPSHOT
>
>         Attachments: MYFACES-2930.patch
>
>
> The ClassByteCodeAnnotationFilter used to check classes for annotations by 
> reading their bytecode doesn't read the constants pool table correctly.
> The current code reads the number of entries from the class file and then 
> reads each entry in the pool in a "for" loop. Unfortunately the code fails to 
> process entries of the type "CONSTANT_Long" and "CONSTANT_Double" correctly. 
> The Java VM spec says:
> "All 8-byte constants take up two entries in the constant_pool table of the 
> class file. If a CONSTANT_Long_info or CONSTANT_Double_info structure is the 
> item in the constant_pool table at index n, then the next usable item in the 
> pool is located at index n+2. The constant_pool index n+1 must be valid but 
> is considered unusable."
> From: 
> http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#1348
> The ClassByteCodeAnnotationFilter doesn't increase the loop counter for these 
> entry types. Thus the filter will read bytes outside of the constants pool as 
> soon as it finds a double or long constant in the constants pool because it 
> will try to read more entries than there actually are.
> Please note that this doesn't lead to faulty behavior of the class, because 
> if the reader reaches the end of the constants pool, it didn't find any 
> reference until then and therefore it is OK to abort scanning and return 
> "false".
> Find attached a patch containing a fix for this issue and a small unit test 
> for the ClassByteCodeAnnotationFilter. I also added a log statement to 
> default block of the switch statement. I guess this wasn't done because the 
> current implementation often found bad tag values because of this bug. 

-- 
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