You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by "Gregory Shimansky (JIRA)" <ji...@apache.org> on 2007/06/06 11:50:26 UTC

[jira] Updated: (HARMONY-4052) [drlvm][classloader] Compatibility: ClassLodert.defineClass() throws ClassFormatError for class with incorrect name only when -Xverify option is set while RI always throws this error

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

Gregory Shimansky updated HARMONY-4052:
---------------------------------------

    Summary: [drlvm][classloader] Compatibility: ClassLodert.defineClass() throws ClassFormatError for class with incorrect name only when -Xverify option is set while RI always throws this error  (was: [drlvm][kernel] Compatibility: ClassLodert.defineClass() throws ClassFormatError for class with incorrect name only when -Xverify option is set while RI always throws this error)

I am quite sure that kernel class ClassLoader is not to be blamed for an incorrect exception. It passes all bytes for classes to the VM bootstrap class loader. So I changed the summary to mark it as a classloader specific bug.

> [drlvm][classloader] Compatibility: ClassLodert.defineClass() throws ClassFormatError for class with incorrect name only when -Xverify option is set while RI always throws this error
> --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: HARMONY-4052
>                 URL: https://issues.apache.org/jira/browse/HARMONY-4052
>             Project: Harmony
>          Issue Type: Bug
>          Components: DRLVM
>         Environment: Windows and Linux
>            Reporter: Vera Petrashkova
>            Priority: Minor
>         Attachments: aaa_class.zip
>
>
> According to J2SE specification ClassLoader.defineClass(String name, byte[] b, int off, int len) method throws ClassFormatError if the data did not contain a valid class.
> When the data contain some class with incorrect class name then DRLVM throws ClassFormatError only if -Xverify option was set.
> Otherwise it throws VerifyError when name is not null and LinkageError when name equals null.
> RI always throws ClassFormatError when used class contains wrong name.
> The following test demonstrates this issue. It uses synthetic class aaa which are placed to the attachment
> ---------------------a1.java----------------------
> import java.io.*;
> public class a1 { 
>  
>    public static void main (String[] args) { 
>         byte[] bbb1 = new byte[11];
>         byte[] bbb2 = new byte[500];
>         int lastBytes = 0;
>         String name = "";
>         String name1 = "";
>         try { 
>             Class firstCl = Class.forName("aaa");
>             InputStream is = firstCl.getResourceAsStream("aaa.class");
>             if (is == null) {
>                 System.err.println("Can not open InputStream : aaa.class");
>                 return;
>             }
>             DataInputStream dIn = new DataInputStream(is);
>             dIn.read(bbb1, 0, 11);
>             dIn.readUTF();
>             lastBytes = dIn.read(bbb2, 0, bbb2.length);
>             dIn.close();
>         } catch (Throwable e) {
>             e.printStackTrace();
>             System.err.println("Test failed");
>             return;
>         }
>         myClassLoader cLoad = new myClassLoader();
>         try {
>             name = "[Zaaabbb";
>             name1 = name;
>             System.err.println("Use name: "+name1);
>             ByteArrayOutputStream bos = new ByteArrayOutputStream();
>             DataOutputStream dOut = new DataOutputStream(bos);
>             dOut.write(bbb1, 0, 11);
>             dOut.writeUTF(name);
>             dOut.write(bbb2, 0, lastBytes);
>             dOut.close();
>             byte[] b1 = bos.toByteArray();
>             Class cl = cLoad.defineKlass(name, b1, 0, b1.length);
>             System.err.println("Test failed: ClassFormError was not thrown as expected");
>         } catch (ClassFormatError e) {
>             e.printStackTrace();
>             System.err.println("Test passed");
>         } catch (Throwable e) { 
>             e.printStackTrace(); 
>             System.err.println("Test failed");
>              
>         } 
>         try {
>             name = "[Zaaabbb";
>             name1 = null;
>             System.err.println("Use name: "+name1);
>             ByteArrayOutputStream bos = new ByteArrayOutputStream();
>             DataOutputStream dOut = new DataOutputStream(bos);
>             dOut.write(bbb1, 0, 11);
>             dOut.writeUTF(name);
>             dOut.write(bbb2, 0, lastBytes);
>             dOut.close();
>             byte[] b1 = bos.toByteArray();
>             Class cl = cLoad.defineKlass(name, b1, 0, b1.length);
>             System.err.println("Test failed: ClassFormError was not thrown as expected");
>         } catch (ClassFormatError e) {
>             e.printStackTrace();
>             System.err.println("Test passed");
>         } catch (Throwable e) { 
>             e.printStackTrace(); 
>             System.err.println("Test failed");
>              
>         } 
>     } 
> } 
> class myClassLoader extends ClassLoader {
>     public Class defineKlass(String name, byte[] ar, int st, int len) {
>         return super.defineClass(name, ar, st, len);
>     }
> }
> ---------------------------aaa.ccode------------------------
> magic = xCAFEBABE
> minor_version = 3
> major_version = 45
> constant_pool_count = 12
> constant_pool {
>   /* #1 */ UTF8 = "aaa"
>   /* #2 */ Class = #3
>   /* #3 */ UTF8 = "java/lang/Object"
>   /* #4 */ Class = #1
>   /* #5 */ UTF8 = "<init>"
>   /* #6 */ UTF8 = "()V"
>   /* #7 */ UTF8 = "Code"
>   /* #8 */ Method = #2 #9
>   /* #9 */ NameAndType = #5 #6
>   /* #10 */ UTF8 = "I"
>   /* #11 */ UTF8 = "testF"
> }
> access_flags = PUBLIC SUPER
> this_class = #4
> super_class = #2
> interfaces_count = 0
> fields_count = 1
> fields {
>     field {
>         access_flag = PUBLIC
>         name_index = #11
>         descriptor_index = #10
>         attributes_count = 0
>     }
> }
> methods_count = 1
> methods {
>     method {
>         access_flag = PUBLIC
>         name_index = #5
>         descriptor_index = #6
>         attributes_count = 1
>         attributes {
>             attribute Code {
>             attribute_name_index = #7
>             attribute_length = 17
>             max_stack = 1
>             max_locals = 1
>             code_length = 5
>             code asm {
>                 0:    aload_0
>                 1:    invokespecial #8
>                 4:    return
>             }
>             exception_table_length = 0
>             attributes_count = 0
>             }
>         }
>     }
> }
> attributes_count = 0
> ----------------------------------------
> Run test
> java a1
> java -Xverify a1
> Output on RI:
> =============
> java version "1.5.0_06"
> 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)
> Use name: [Zaaabbb
> java.lang.ClassFormatError: Illegal class name "[Zaaabbb" in class file [Zaaabbb
>         at java.lang.ClassLoader.defineClass1(Native Method)
>         at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
>         at java.lang.ClassLoader.defineClass(ClassLoader.java:465)
>         at myClassLoader.defineKlass(a1.java:80)
>         at a1.main(a1.java:41)
> Test passed
> Use name: null
> java.lang.ClassFormatError: Illegal class name "[Zaaabbb" in class file [Zaaabbb
>         at java.lang.ClassLoader.defineClass1(Native Method)
>         at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
>         at java.lang.ClassLoader.defineClass(ClassLoader.java:465)
>         at myClassLoader.defineKlass(a1.java:80)
>         at a1.main(a1.java:62)
> Test passed
> java version "1.5.0_06"
> 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)
> Use name: [Zaaabbb
> java.lang.ClassFormatError: Illegal class name "[Zaaabbb" in class file [Zaaabbb
>         at java.lang.ClassLoader.defineClass1(Native Method)
>         at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
>         at java.lang.ClassLoader.defineClass(ClassLoader.java:465)
>         at myClassLoader.defineKlass(a1.java:80)
>         at a1.main(a1.java:41)
> Test passed
> Use name: null
> java.lang.ClassFormatError: Illegal class name "[Zaaabbb" in class file [Zaaabbb
>         at java.lang.ClassLoader.defineClass1(Native Method)
>         at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
>         at java.lang.ClassLoader.defineClass(ClassLoader.java:465)
>         at myClassLoader.defineKlass(a1.java:80)
>         at a1.main(a1.java:62)
> Test passed
> Output on DRLVM:
> ===============
> 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 = r544083, (Jun  4 2007), Windows/ia32/msvc 1310, debug build
> http://harmony.apache.org
> Use name: [Zaaabbb
> java.lang.VerifyError: (class: [Zaaabbb, method: <init>()V) Constructor must be invoked
>         at java.lang.ClassLoader.defineClass0(ClassLoader.java)
>         at java.lang.ClassLoader.defineClass(ClassLoader.java:437)
>         at java.lang.ClassLoader.defineClass(ClassLoader.java:378)
>         at myClassLoader.defineKlass(a1.java:80)
>         at a1.main(a1.java:41)
> Test failed
> Use name: null
> java.lang.LinkageError: Illegal attempt to redefine class : [Zaaabbb
>         at java.lang.ClassLoader.defineClass0(ClassLoader.java)
>         at java.lang.ClassLoader.defineClass(ClassLoader.java:437)
>         at java.lang.ClassLoader.defineClass(ClassLoader.java:378)
>         at myClassLoader.defineKlass(a1.java:80)
>         at a1.main(a1.java:62)
> Test failed
> 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 = r544083, (Jun  4 2007), Windows/ia32/msvc 1310, debug build
> http://harmony.apache.org
> Use name: [Zaaabbb
> java.lang.ClassFormatError: [Zaaabbb: illegal CONSTANT_Class name "[Zaaabbb"
>         at java.lang.ClassLoader.defineClass0(ClassLoader.java)
>         at java.lang.ClassLoader.defineClass(ClassLoader.java:437)
>         at java.lang.ClassLoader.defineClass(ClassLoader.java:378)
>         at myClassLoader.defineKlass(a1.java:80)
>         at a1.main(a1.java:41)
> Test passed
> Use name: null
> java.lang.ClassFormatError: [Zaaabbb: illegal CONSTANT_Class name "[Zaaabbb"
>         at java.lang.ClassLoader.defineClass0(ClassLoader.java)
>         at java.lang.ClassLoader.defineClass(ClassLoader.java:437)
>         at java.lang.ClassLoader.defineClass(ClassLoader.java:378)
>         at myClassLoader.defineKlass(a1.java:80)
>         at a1.main(a1.java:62)
> Test passed
> This bug causes the failures of the tests from Stress test suite (https://issues.apache.org/jira/browse/HARMONY-3536)
> stress.org.apache.harmony.test.stress.classloader.MixSynchThreads.LargeClassName.testLargeClassName_W1
> stress.org.apache.harmony.test.stress.classloader.MixThreads.LargeClassName.testLargeClassName_W2
> stress.org.apache.harmony.test.stress.classloader.NotSynchThreads.LargeClassName.testLargeClassName_W1
> stress.org.apache.harmony.test.stress.classloader.NotSynchThreads.LargeClassName.testLargeClassName_W2
> stress.org.apache.harmony.test.stress.classloader.OneThread.LargeClassName.testLargeClassName_W1
> stress.org.apache.harmony.test.stress.classloader.OneThread.LargeClassName.testLargeClassName_W2
> stress.org.apache.harmony.test.stress.classloader.SynchThreads.LargeClassName.testLargeClassName_W1
> stress.org.apache.harmony.test.stress.classloader.SynchThreads.LargeClassName.testLargeClassName_W2

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