Incorrect hehavior on the class name (UTF8) in the constant pool of bytecode

Ioi Lam ioi.lam at oracle.com
Fri Oct 29 04:05:41 UTC 2021


Hi Cheng Jin,

Dumped.class couldn't be posted to the mailing list. Could you upload it 
somewhere, or send a base64-encoded version of it?

$ base64 < dumped.class

Thanks

- Ioi


On 10/28/21 5:25 PM, Cheng Jin wrote:
> One or more of the following files ( dumped.class ) violates IBM policy and all attachment(s) have been removed from the message.
>
> **********************************************************************
>
>
> Hi There,
>
> I created a simple test that loads a class file as follows to see whether a
> package name in the constant pool is rejected as invalid for a class name.
> However, it surprised me that it just passed without any exception on
> Hotspot (e.g. OpenJDK11).
>
> (See attached file: dumped.class)
>
> constant_pool (in dumped.class)
> ...
> 3. Utf8
> tag: 1
> length: 16
> bytes: die/verwandlung/ <----- a package name rather than an valid class
> name
> 4. Class
> tag: 7
> name_index: 3 <------
>
>
> import java.io.*;
> public class CustomClassLoader extends ClassLoader {
>
>      @Override
>      public Class findClass(String fileName) throws ClassNotFoundException {
>          byte[] b = loadClassBytes(fileName);
>          return defineClass(null, b, 0, b.length);
>      }
>
>      private byte[] loadClassBytes(String fileName)  {
>          InputStream inputStream =
> getClass().getClassLoader().getResourceAsStream(fileName + ".class");
>          ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
>          try {
>              int nextByte = 0;
>              while ((nextByte = inputStream.read()) != -1) {
>                  byteOutStream.write(nextByte);
>              }
>          } catch (IOException e) {
>              e.printStackTrace();
>          }
>          return byteOutStream.toByteArray();
>      }
>
>      public static void main(String args[]) {
>      try {
>         CustomClassLoader  cl = new CustomClassLoader();
>         cl.findClass("dumped");
>         System.out.println("DONE.....");
>        } catch (Exception e) {
>           e.printStackTrace();
>        }
>      }
> }
>
> $ jdk11_hotspot/bin/java  CustomClassLoader
> DONE.....
>
>
> According to the VM Spec at 4.2.1 Binary Class and Interface Names
>
> Class and interface names that appear in class file structures are always
> represented in a fully qualified form known as binary names (JLS §13.1).
> ...In this internal form, the ASCII periods (.) that normally separate the
> identifiers which
> make up the binary name are replaced by ASCII forward slashes (/). The
> identifiers
> themselves must be unqualified names (§4.2.2).
>
> For example, the normal binary name of class Thread is java.lang.Thread. In
> the
> internal form used in descriptors in the class file format, a reference to
> the name of class
> Thread is implemented using a CONSTANT_Utf8_info structure representing the
> string
> java/lang/Thread.
>
> It means a valid class name should be something like "xxx" or
> "xxx/yyy/zzz" (where "/" only serves as the separator in between, and "/"
> shouldn't occur at the end),
> in which case "xxx/yyy/" is treated as invalid for a class name.
>
>
> So I am wondering why Hotspot doesn't follow the VM Spec to check the
> invalid package name in the constant pool.
>
>
> Thanks and Best Regards
> Cheng Jin



More information about the hotspot-dev mailing list