RFR: 8026877: Error in opening JAR file when invalid jar specified with -Xbootclasspath/a on OpenJDK build

David Holmes david.holmes at oracle.com
Wed Oct 23 18:05:49 PDT 2013


This is a simple change with a complex background, so please bear with 
me. :)

Here's the background. There is a class sun.misc.PostVMInitHook that 
only exists in the Oracle JDK (closed sources). There is a fragment of 
code in create_vm that runs this hook, if present, as part of the VM 
initialization sequence. This class is also on the list of well known 
classes to preload during early VM initialization 
(Universe::Genesis()->SystemDictionary::initialize()).

The problem arises when an invalid jar file, eg a zero-length dummy.jar, 
is specified on -Xbootclasspath.

In the Oracle JDK you will likely never discover that the invalid jar is 
present. During VM initialization all classes are in the meta-index that 
point to rt.jar and the "lazy loading" approach doesn't examine other 
entities on the bootclasspath unless necessary. So dummy.jar is 
completely ignored until the system classloader starts to load classes - 
at which point the bootloader upon not finding the class in the 
meta-index searches the bootclasspath, finds the invalid jar file and 
throws a ClassNotFoundException with a message about an invalid jar 
file. However the system (or extensions) loader expects the bootloader 
to throw such an exception if the required class can not be found on the 
bootclasspath (which it can't) and so continues to load it from the 
classpath and the application continues oblivious to the invalid jar. 
This is arguably not a good thing but not the subject of this particular 
change. ;-)

In the OpenJDK the PostVMInitHook class does not exist so when 
preloading fails to find it in rt.jar as expected, the bootloader starts 
searching for it and encounters the invalid dummy.jar. So as previously 
described it triggers ClassNotFoundException to be thrown. However, the 
exception throwing logic in the VM has to watch for trying to throw 
exceptions during early VM initialization when the VM is not really 
ready to throw the exception. It sees VM initialization is still in 
progress so it instead calls vm_exit_during_initialization and the user 
sees:

Error occurred during initialization of VM
java/lang/ClassNotFoundException: error in opening JAR file <Zip file 
open error> dummy.jar

So the Oracle JDK effectively ignored the invalid jar file while the 
OpenJDK aborts during VM initialization.

There is a simple "fix" that allows the OpenJDK to behave the same as 
the Oracle JDK - we remove the PostVMInitHook class from the list of 
classes to preload. There's really no need for it to be preloaded and 
create_vm loads numerous classes that are not preloaded, so we simply 
handle this the same way. Now not finding the class during VM 
initialization doesn't trigger an exception (and if it did the logic 
would ignore it anyway).

http://cr.openjdk.java.net/~dholmes/8026877/webrev/

Thanks for reading this far :)

David


More information about the hotspot-dev mailing list