RFR 8020675: invalid jar file in the bootclasspath could lead to jvm fatal error
David Holmes
david.holmes at oracle.com
Thu Aug 22 23:54:36 PDT 2013
On 23/08/2013 4:05 PM, Calvin Cheung wrote:
> On 8/22/2013 5:21 PM, David Holmes wrote:
>> Hi Calvin,
>>
>> I'm having trouble keeping track of this one ...
>>
>> On 23/08/2013 8:55 AM, Calvin Cheung wrote:
>>> Note that the synopsis of the bug has been changed from:
>>> "Trying to print to a pdf file with PDFill PDF&Image Writer 10.0
>>> Build 4"
>>>
>>> bug link: https://bugs.openjdk.java.net/browse/JDK-8020675
>>>
>>> I've included the suggestions from Coleen and Ioi in this version of
>>> webrev:
>>> http://cr.openjdk.java.net/~ccheung/8020675/webrev/
>>
>> I don't understand your _has_error logic:
>>
>> 325 ClassPathEntry* cpe = resolve_entry(CHECK_NULL);
>> 326 if (cpe == NULL) {
>> 327 _has_error = true;
>> 328 return NULL;
>>
>> we will only hit line 327 if resolve_entry returns NULL _without_
>> there being an exception pending. How does that occur? What is
>> different about the two cases regardless?
> The _has_error flag was suggested by Ioi and is to avoid opening the
> invalid jar file again.
Can't we just remove it from the classpath representation?
> The call sequence is as follows:
> ClassLoader::load_classfile()
> -> LazyClassPathEntry::open_stream()
> -> LazyClassPathEntry::resolve_entry()
> -> ClassLoader::create_class_path_entry()
>
> For second time, it'll return NULL without calling resolve_entry() again.
>
> The LazyClassPathEntry instance is instantiated by the following calls:
> ClassLoader::setup_bootstrap_search_path()
> ->ClassLoader::update_class_path_entry_list()
> ->ClassLoader::create_class_path_entry(path, &st,
> LazyBootClassLoader, CHECK)
>
> LazyBootClassLoader is set to true by default.
Sorry but I don't see how that answers my question. Based on the below
there isn't a second time because the first time will cause the pending
exception which will terminate the VM. Even if we dont terminate and
somehow call this again, we didn't set _has_error the first time anyway! ???
>>
>> And we still have this sequence:
>>
>> void ClassLoader::initialize() {
>> assert(_package_hash_table == NULL, "should have been initialized by
>> now.");
>> EXCEPTION_MARK;
>> ...
>> setup_bootstrap_search_path();
>> -> update_class_path_entry_list(path, false);
>> -> create_class_path_entry((char *)path, st, &new_entry,
>> LazyBootClassLoader, CHECK);
> As mentioned above, this call sequence is for instantiating the
> LazyClassPathEntry instances.
>>
>> So if we return after the call to create_class_path_entry with an
>> exception pending we will crash when we hit the EXCEPTION_MARK. Why
>> doesn't this happen?
> During vm initilization, it's ok to have exception pending. The
> destructor of ExceptionMark is as follows:
> ExceptionMark::~ExceptionMark() {
> if (_thread->has_pending_exception()) {
> Handle exception(_thread, _thread->pending_exception());
> _thread->clear_pending_exception(); // Needed to avoid infinite
> recursion
> if (is_init_completed()) {
> exception->print();
> fatal("ExceptionMark destructor expects no pending exceptions");
> } else {
> vm_exit_during_initialization(exception);
> }
> }
> }
>
> So if is_init_completed() is false, it'll just print an error and exit.
So we do hit it - ok. So this yet another place where the VM should not
abort during initialization.
Thanks,
David
> thanks,
> Calvin
>
>
>>
>> Thanks,
>> David
>>
>>
>>> Tests:
>>> jprt
>>> (in progress - only about 30 tests left on the windows
>>> platforms, no failure so far;
>>> a previous run with only Coleen's suggestions was successful)
>>>
>>> vm.quick.testlist on linux_x64
>>>
>>> Please review.
>>>
>>> thanks,
>>> Calvin
>
More information about the hotspot-runtime-dev
mailing list