mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-19 18:44:38 +02:00
8166358: Re-enable String verification in java_lang_String::create_from_str()
Check for invalid strings in class names in debug mode, and only verify valid strings in create_for_str(). Reviewed-by: dholmes, hseigel
This commit is contained in:
parent
a689a1108c
commit
6aa15ad7ab
8 changed files with 152 additions and 100 deletions
|
@ -810,12 +810,13 @@ JVM_ENTRY(jclass, JVM_FindClassFromBootLoader(JNIEnv* env,
|
|||
const char* name))
|
||||
JVMWrapper("JVM_FindClassFromBootLoader");
|
||||
|
||||
// Java libraries should ensure that name is never null...
|
||||
// Java libraries should ensure that name is never null or illegal.
|
||||
if (name == NULL || (int)strlen(name) > Symbol::max_length()) {
|
||||
// It's impossible to create this class; the name cannot fit
|
||||
// into the constant pool.
|
||||
return NULL;
|
||||
}
|
||||
assert(UTF8::is_legal_utf8((const unsigned char*)name, (int)strlen(name), false), "illegal UTF name");
|
||||
|
||||
TempNewSymbol h_name = SymbolTable::new_symbol(name);
|
||||
Klass* k = SystemDictionary::resolve_or_null(h_name, CHECK_NULL);
|
||||
|
@ -834,14 +835,10 @@ JVM_ENTRY(jclass, JVM_FindClassFromCaller(JNIEnv* env, const char* name,
|
|||
jboolean init, jobject loader,
|
||||
jclass caller))
|
||||
JVMWrapper("JVM_FindClassFromCaller throws ClassNotFoundException");
|
||||
// Java libraries should ensure that name is never null...
|
||||
if (name == NULL || (int)strlen(name) > Symbol::max_length()) {
|
||||
// It's impossible to create this class; the name cannot fit
|
||||
// into the constant pool.
|
||||
THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), name);
|
||||
}
|
||||
|
||||
TempNewSymbol h_name = SymbolTable::new_symbol(name);
|
||||
TempNewSymbol h_name =
|
||||
SystemDictionary::class_name_symbol(name, vmSymbols::java_lang_ClassNotFoundException(),
|
||||
CHECK_NULL);
|
||||
|
||||
oop loader_oop = JNIHandles::resolve(loader);
|
||||
oop from_class = JNIHandles::resolve(caller);
|
||||
|
@ -870,20 +867,9 @@ JVM_END
|
|||
JVM_ENTRY(jclass, JVM_FindClassFromClass(JNIEnv *env, const char *name,
|
||||
jboolean init, jclass from))
|
||||
JVMWrapper("JVM_FindClassFromClass");
|
||||
if (name == NULL) {
|
||||
THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), "No class name given");
|
||||
}
|
||||
if ((int)strlen(name) > Symbol::max_length()) {
|
||||
// It's impossible to create this class; the name cannot fit
|
||||
// into the constant pool.
|
||||
Exceptions::fthrow(THREAD_AND_LOCATION,
|
||||
vmSymbols::java_lang_NoClassDefFoundError(),
|
||||
"Class name exceeds maximum length of %d: %s",
|
||||
Symbol::max_length(),
|
||||
name);
|
||||
return 0;
|
||||
}
|
||||
TempNewSymbol h_name = SymbolTable::new_symbol(name);
|
||||
TempNewSymbol h_name =
|
||||
SystemDictionary::class_name_symbol(name, vmSymbols::java_lang_ClassNotFoundException(),
|
||||
CHECK_NULL);
|
||||
oop from_class_oop = JNIHandles::resolve(from);
|
||||
Klass* from_class = (from_class_oop == NULL)
|
||||
? (Klass*)NULL
|
||||
|
@ -949,23 +935,10 @@ static jclass jvm_define_class_common(JNIEnv *env, const char *name,
|
|||
ClassLoader::perf_app_classfile_bytes_read()->inc(len);
|
||||
}
|
||||
|
||||
// Since exceptions can be thrown, class initialization can take place
|
||||
// if name is NULL no check for class name in .class stream has to be made.
|
||||
TempNewSymbol class_name = NULL;
|
||||
if (name != NULL) {
|
||||
const int str_len = (int)strlen(name);
|
||||
if (str_len > Symbol::max_length()) {
|
||||
// It's impossible to create this class; the name cannot fit
|
||||
// into the constant pool.
|
||||
Exceptions::fthrow(THREAD_AND_LOCATION,
|
||||
vmSymbols::java_lang_NoClassDefFoundError(),
|
||||
"Class name exceeds maximum length of %d: %s",
|
||||
Symbol::max_length(),
|
||||
name);
|
||||
return 0;
|
||||
}
|
||||
class_name = SymbolTable::new_symbol(name, str_len);
|
||||
}
|
||||
// Class resolution will get the class name from the .class stream if the name is null.
|
||||
TempNewSymbol class_name = name == NULL ? NULL :
|
||||
SystemDictionary::class_name_symbol(name, vmSymbols::java_lang_NoClassDefFoundError(),
|
||||
CHECK_NULL);
|
||||
|
||||
ResourceMark rm(THREAD);
|
||||
ClassFileStream st((u1*)buf, len, source, ClassFileStream::verify);
|
||||
|
@ -1054,24 +1027,10 @@ static jclass jvm_lookup_define_class(JNIEnv *env, jclass lookup, const char *na
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// Since exceptions can be thrown, class initialization can take place
|
||||
// if name is NULL no check for class name in .class stream has to be made.
|
||||
TempNewSymbol class_name = NULL;
|
||||
if (name != NULL) {
|
||||
const int str_len = (int)strlen(name);
|
||||
if (str_len > Symbol::max_length()) {
|
||||
// It's impossible to create this class; the name cannot fit
|
||||
// into the constant pool.
|
||||
Exceptions::fthrow(THREAD_AND_LOCATION,
|
||||
vmSymbols::java_lang_NoClassDefFoundError(),
|
||||
"Class name exceeds maximum length of %d: %s",
|
||||
Symbol::max_length(),
|
||||
name);
|
||||
return 0;
|
||||
}
|
||||
class_name = SymbolTable::new_symbol(name, str_len);
|
||||
}
|
||||
// Class resolution will get the class name from the .class stream if the name is null.
|
||||
TempNewSymbol class_name = name == NULL ? NULL :
|
||||
SystemDictionary::class_name_symbol(name, vmSymbols::java_lang_NoClassDefFoundError(),
|
||||
CHECK_NULL);
|
||||
|
||||
Handle protection_domain (THREAD, JNIHandles::resolve(pd));
|
||||
const char* source = is_nestmate ? host_class->external_name() : "__JVM_LookupDefineClass__";
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue