Uploaded image for project: 'Harmony'
  1. Harmony
  2. 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

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Minor
    • Resolution: Fixed
    • None
    • None
    • DRLVM
    • None
    • Windows and Linux
    • Patch Available

    Description

      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

      Attachments

        1. aaa_class.zip
          0.8 kB
          Vera Petrashkova
        2. cfe.patch
          0.9 kB
          Vera Volynets

        Issue Links

          Activity

            People

              gshimansky Gregory Shimansky
              vpetrash Vera Petrashkova
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: