8312401: SymbolTable::do_add_if_needed hangs when called in InstanceKlass::add_initialization_error path with requesting length exceeds max_symbol_length

Reviewed-by: dholmes, coleenp, iklam
This commit is contained in:
Jiangli Zhou 2023-07-25 16:37:51 +00:00
parent e554fdee25
commit 36f3bae556
3 changed files with 55 additions and 2 deletions

View file

@ -2761,15 +2761,19 @@ Handle java_lang_Throwable::create_initialization_error(JavaThread* current, Han
assert(throwable.not_null(), "shouldn't be");
// Now create the message from the original exception and thread name.
Symbol* message = java_lang_Throwable::detail_message(throwable());
ResourceMark rm(current);
const char *message = nullptr;
oop detailed_message = java_lang_Throwable::message(throwable());
if (detailed_message != nullptr) {
message = java_lang_String::as_utf8_string(detailed_message);
}
stringStream st;
st.print("Exception %s%s ", throwable()->klass()->name()->as_klass_external_name(),
message == nullptr ? "" : ":");
if (message == nullptr) {
st.print("[in thread \"%s\"]", current->name());
} else {
st.print("%s [in thread \"%s\"]", message->as_C_string(), current->name());
st.print("%s [in thread \"%s\"]", message, current->name());
}
Symbol* exception_name = vmSymbols::java_lang_ExceptionInInitializerError();

View file

@ -338,6 +338,7 @@ Symbol* SymbolTable::lookup_common(const char* name,
}
Symbol* SymbolTable::new_symbol(const char* name, int len) {
assert(len <= Symbol::max_length(), "sanity");
unsigned int hash = hash_symbol(name, len, _alt_hash);
Symbol* sym = lookup_common(name, len, hash);
if (sym == nullptr) {
@ -353,6 +354,7 @@ Symbol* SymbolTable::new_symbol(const Symbol* sym, int begin, int end) {
assert(sym->refcount() != 0, "require a valid symbol");
const char* name = (const char*)sym->base() + begin;
int len = end - begin;
assert(len <= Symbol::max_length(), "sanity");
unsigned int hash = hash_symbol(name, len, _alt_hash);
Symbol* found = lookup_common(name, len, hash);
if (found == nullptr) {

View file

@ -0,0 +1,47 @@
/*
* Copyright (c) 2023, Google and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @summary Test to verify throwing an exception with extra long message does
* not cause hang.
* @bug 8312401
* @run main/othervm LongExceptionMessageTest
*/
class ClassWithLongExceptionMessage {
static {
if (true) throw new AssertionError("lorem ipsum ".repeat(16000));
}
}
public class LongExceptionMessageTest {
public static void main(String[] args) {
try {
new ClassWithLongExceptionMessage();
} catch(Throwable t) {}
}
}