mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-17 17:44:40 +02:00
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:
parent
e554fdee25
commit
36f3bae556
3 changed files with 55 additions and 2 deletions
|
@ -2761,15 +2761,19 @@ Handle java_lang_Throwable::create_initialization_error(JavaThread* current, Han
|
||||||
assert(throwable.not_null(), "shouldn't be");
|
assert(throwable.not_null(), "shouldn't be");
|
||||||
|
|
||||||
// Now create the message from the original exception and thread name.
|
// Now create the message from the original exception and thread name.
|
||||||
Symbol* message = java_lang_Throwable::detail_message(throwable());
|
|
||||||
ResourceMark rm(current);
|
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;
|
stringStream st;
|
||||||
st.print("Exception %s%s ", throwable()->klass()->name()->as_klass_external_name(),
|
st.print("Exception %s%s ", throwable()->klass()->name()->as_klass_external_name(),
|
||||||
message == nullptr ? "" : ":");
|
message == nullptr ? "" : ":");
|
||||||
if (message == nullptr) {
|
if (message == nullptr) {
|
||||||
st.print("[in thread \"%s\"]", current->name());
|
st.print("[in thread \"%s\"]", current->name());
|
||||||
} else {
|
} 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();
|
Symbol* exception_name = vmSymbols::java_lang_ExceptionInInitializerError();
|
||||||
|
|
|
@ -338,6 +338,7 @@ Symbol* SymbolTable::lookup_common(const char* name,
|
||||||
}
|
}
|
||||||
|
|
||||||
Symbol* SymbolTable::new_symbol(const char* name, int len) {
|
Symbol* SymbolTable::new_symbol(const char* name, int len) {
|
||||||
|
assert(len <= Symbol::max_length(), "sanity");
|
||||||
unsigned int hash = hash_symbol(name, len, _alt_hash);
|
unsigned int hash = hash_symbol(name, len, _alt_hash);
|
||||||
Symbol* sym = lookup_common(name, len, hash);
|
Symbol* sym = lookup_common(name, len, hash);
|
||||||
if (sym == nullptr) {
|
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");
|
assert(sym->refcount() != 0, "require a valid symbol");
|
||||||
const char* name = (const char*)sym->base() + begin;
|
const char* name = (const char*)sym->base() + begin;
|
||||||
int len = end - begin;
|
int len = end - begin;
|
||||||
|
assert(len <= Symbol::max_length(), "sanity");
|
||||||
unsigned int hash = hash_symbol(name, len, _alt_hash);
|
unsigned int hash = hash_symbol(name, len, _alt_hash);
|
||||||
Symbol* found = lookup_common(name, len, hash);
|
Symbol* found = lookup_common(name, len, hash);
|
||||||
if (found == nullptr) {
|
if (found == nullptr) {
|
||||||
|
|
|
@ -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) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue