harmony-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Vera Petrashkova (JIRA)" <j...@apache.org>
Subject [jira] Created: (HARMONY-4359) [drlvm][classloader] VM does not reject class file with contains incorrect InnerClasses attribute with duplicate entries in classes array
Date Fri, 06 Jul 2007 07:17:04 GMT
[drlvm][classloader] VM does not reject class file with contains incorrect InnerClasses attribute
with duplicate entries in classes array
-----------------------------------------------------------------------------------------------------------------------------------------

                 Key: HARMONY-4359
                 URL: https://issues.apache.org/jira/browse/HARMONY-4359
             Project: Harmony
          Issue Type: Bug
          Components: DRLVM
            Reporter: Vera Petrashkova
            Priority: Minor
         Attachments: InnerClassAtr.zip

According to the J2SE VM specifications of InnerClasses attribute:
The InnerClasses attribute has the following format: 
   InnerClasses_attribute {
      u2 attribute_name_index;
      u4 attribute_length;
      u2 number_of_classes;
      {  
         u2 inner_class_info_index;	     
         u2 outer_class_info_index;	     
         u2 inner_name_index;	     
         u2 inner_class_access_flags;	     
      } classes[number_of_classes];
    }
and 
    classes []
          Every CONSTANT_Class_info entry in the constant pool table which represents a class
or interface  
          that is not a package member must have exactly one corresponding entry in the "classes"
array. 

But VM does not reject class  if its  InnerClasses attribute contains 2 entries in "classes"
array
and they correspond the same CONSTANT_Class_info element in constant pool table.

To reproduce this issue run the following test:
---------icA.ccode-----------
magic = xCAFEBABE
minor_version = 3
major_version = 45
constant_pool_count = 19
constant_pool {
  /* #1 */ Method = #12 #7
  /* #2 */ Class = #11
  /* #3 */ UTF8 = "java/lang/Object"
  /* #4 */ UTF8 = "SourceFile"
  /* #5 */ UTF8 = "<init>"
  /* #6 */ UTF8 = "icA.ccode"
  /* #7 */ NameAndType = #5 #10
  /* #8 */ UTF8 = "Code"
  /* #9 */ UTF8 = "test"
  /* #10 */ UTF8 = "()V"
  /* #11 */ UTF8 = "icA"
  /* #12 */ Class = #3
  /* #13 */ UTF8 = "InnerClasses"
  /* #14 */ Class = #16
  /* #15 */ Class = #17
  /* #16 */ UTF8 = "pack/inner$nestedClass"
  /* #17 */ UTF8 = "inner"
  /* #18 */ UTF8 = "nestedClass"
}

access_flags = PUBLIC SUPER  // x21
this_class = #2
super_class = #12  // "java/lang/Object"
interfaces_count = 0
fields_count = 0
methods_count = 2
methods {
  method {
    access_flag = PUBLIC  // x01
    name_index = #5  // "<init>"
    descriptor_index = #10  // "()V"
    attributes_count = 1
      attributes {
        attribute Code {
          attribute_name_index = #8  // "Code"
          attribute_length = 17
          max_stack = 1
          max_locals = 1
          code_length = 5
          code asm {
          0:    aload_0
          1:    invokespecial #1
          4:    return
          }
          exception_table_length = 0
          attributes_count = 0
        }
      }
  }

// Test method
  method {
    access_flag = PUBLIC  // x01
    name_index = #9  // "test"
    descriptor_index = #10  // "()V"
    attributes_count = 1
      attributes {
        attribute Code {
          attribute_name_index = #8  // "Code"
          attribute_length = 13
          max_stack = 1
          max_locals = 1
          code_length = 1
          code asm {
          0:    return
          }
          exception_table_length = 0
          attributes_count = 0
        }
      }
  }
}
attributes_count = 1
attributes {
  attribute InnerClasses {
    attribute_name_index = #13
    attribute_length = 18 
    number_of_classes = 2
    InnerClass { // Tested classes array with two same entries for the class #14
        inner_class_info_index = #14 // "pack/inner$nestedClass"
        outer_class_info_index = #15 // "inner"
        inner_name_index = #17  
        inner_class_access_flags = Public 
    }
    InnerClass { // Tested classes array with two same entries for the class #14
        inner_class_info_index = #14 // "pack/inner$nestedClass"
        outer_class_info_index = #15 // "inner"
        inner_name_index = #17  
        inner_class_access_flags = Public 
    }
 }
}
-----------------------test.java------------------
public class test {
    public static void main(String[] args) {        
        try {
            Class.forName("icA");
            System.out.println("Test failed. ClassFormatError was not thrown");
        } catch (ClassFormatError e) {
            System.out.println("Test passed: " + e);
        } catch (Throwable e){
            System.out.println("Test failed. Unexpected error was thrown");
            e.printStackTrace();
        }
    }
}
---------------------
Use icA class file from attachment.

Output is:
Apache Harmony Launcher : (c) Copyright 1991, 2006 The Apache Software Foundation or its licensors,
as applicable.
java version "1.5.0"
pre-alpha : not complete or compatible
svn = r551077, (Jun 27 2007), Windows/ia32/msvc 1310, release build
http://harmony.apache.org
Test failed. ClassFormatError was not thrown



This test also fails on RI but is passes on BEA JRockit 
=============================
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode)

Test failed. ClassFormatError was not thrown



Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-b64)
BEA WebLogic JRockit(R) (build dra-38972-20041208-2001-win-ia32, R25.0.0-75, GC: System op
timized over throughput (initial strategy singleparpar))

Test passed: java.lang.ClassFormatError: icA : duplicate InnerClass entry: 1


This bug causes the failure of VTS test
vm/jvms/classFile/attributes/innerClasses/innerClasses12/innerClasses12.xml


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


Mime
View raw message