mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 11:34:38 +02:00
Merge
This commit is contained in:
commit
c8db53ce50
11 changed files with 126 additions and 45 deletions
|
@ -2080,9 +2080,10 @@ static char* anon_mmap(char* requested_addr, size_t bytes, bool fixed) {
|
||||||
flags |= MAP_FIXED;
|
flags |= MAP_FIXED;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Map uncommitted pages PROT_READ and PROT_WRITE, change access
|
// Map reserved/uncommitted pages PROT_NONE so we fail early if we
|
||||||
// to PROT_EXEC if executable when we commit the page.
|
// touch an uncommitted page. Otherwise, the read/write might
|
||||||
addr = (char*)::mmap(requested_addr, bytes, PROT_READ|PROT_WRITE,
|
// succeed if we have enough swap space to back the physical page.
|
||||||
|
addr = (char*)::mmap(requested_addr, bytes, PROT_NONE,
|
||||||
flags, -1, 0);
|
flags, -1, 0);
|
||||||
|
|
||||||
if (addr != MAP_FAILED) {
|
if (addr != MAP_FAILED) {
|
||||||
|
|
|
@ -2906,9 +2906,10 @@ static char* anon_mmap(char* requested_addr, size_t bytes, bool fixed) {
|
||||||
flags |= MAP_FIXED;
|
flags |= MAP_FIXED;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Map uncommitted pages PROT_READ and PROT_WRITE, change access
|
// Map reserved/uncommitted pages PROT_NONE so we fail early if we
|
||||||
// to PROT_EXEC if executable when we commit the page.
|
// touch an uncommitted page. Otherwise, the read/write might
|
||||||
addr = (char*)::mmap(requested_addr, bytes, PROT_READ|PROT_WRITE,
|
// succeed if we have enough swap space to back the physical page.
|
||||||
|
addr = (char*)::mmap(requested_addr, bytes, PROT_NONE,
|
||||||
flags, -1, 0);
|
flags, -1, 0);
|
||||||
|
|
||||||
if (addr != MAP_FAILED) {
|
if (addr != MAP_FAILED) {
|
||||||
|
|
|
@ -2027,7 +2027,6 @@ methodHandle ClassFileParser::parse_method(bool is_interface,
|
||||||
u2 method_parameters_length = 0;
|
u2 method_parameters_length = 0;
|
||||||
u1* method_parameters_data = NULL;
|
u1* method_parameters_data = NULL;
|
||||||
bool method_parameters_seen = false;
|
bool method_parameters_seen = false;
|
||||||
bool method_parameters_four_byte_flags;
|
|
||||||
bool parsed_code_attribute = false;
|
bool parsed_code_attribute = false;
|
||||||
bool parsed_checked_exceptions_attribute = false;
|
bool parsed_checked_exceptions_attribute = false;
|
||||||
bool parsed_stackmap_attribute = false;
|
bool parsed_stackmap_attribute = false;
|
||||||
|
@ -2241,26 +2240,14 @@ methodHandle ClassFileParser::parse_method(bool is_interface,
|
||||||
}
|
}
|
||||||
method_parameters_seen = true;
|
method_parameters_seen = true;
|
||||||
method_parameters_length = cfs->get_u1_fast();
|
method_parameters_length = cfs->get_u1_fast();
|
||||||
// Track the actual size (note: this is written for clarity; a
|
if (method_attribute_length != (method_parameters_length * 4u) + 1u) {
|
||||||
// decent compiler will CSE and constant-fold this into a single
|
|
||||||
// expression)
|
|
||||||
// Use the attribute length to figure out the size of flags
|
|
||||||
if (method_attribute_length == (method_parameters_length * 6u) + 1u) {
|
|
||||||
method_parameters_four_byte_flags = true;
|
|
||||||
} else if (method_attribute_length == (method_parameters_length * 4u) + 1u) {
|
|
||||||
method_parameters_four_byte_flags = false;
|
|
||||||
} else {
|
|
||||||
classfile_parse_error(
|
classfile_parse_error(
|
||||||
"Invalid MethodParameters method attribute length %u in class file",
|
"Invalid MethodParameters method attribute length %u in class file",
|
||||||
method_attribute_length, CHECK_(nullHandle));
|
method_attribute_length, CHECK_(nullHandle));
|
||||||
}
|
}
|
||||||
method_parameters_data = cfs->get_u1_buffer();
|
method_parameters_data = cfs->get_u1_buffer();
|
||||||
cfs->skip_u2_fast(method_parameters_length);
|
cfs->skip_u2_fast(method_parameters_length);
|
||||||
if (method_parameters_four_byte_flags) {
|
cfs->skip_u2_fast(method_parameters_length);
|
||||||
cfs->skip_u4_fast(method_parameters_length);
|
|
||||||
} else {
|
|
||||||
cfs->skip_u2_fast(method_parameters_length);
|
|
||||||
}
|
|
||||||
// ignore this attribute if it cannot be reflected
|
// ignore this attribute if it cannot be reflected
|
||||||
if (!SystemDictionary::Parameter_klass_loaded())
|
if (!SystemDictionary::Parameter_klass_loaded())
|
||||||
method_parameters_length = 0;
|
method_parameters_length = 0;
|
||||||
|
@ -2423,13 +2410,8 @@ methodHandle ClassFileParser::parse_method(bool is_interface,
|
||||||
for (int i = 0; i < method_parameters_length; i++) {
|
for (int i = 0; i < method_parameters_length; i++) {
|
||||||
elem[i].name_cp_index = Bytes::get_Java_u2(method_parameters_data);
|
elem[i].name_cp_index = Bytes::get_Java_u2(method_parameters_data);
|
||||||
method_parameters_data += 2;
|
method_parameters_data += 2;
|
||||||
if (method_parameters_four_byte_flags) {
|
elem[i].flags = Bytes::get_Java_u2(method_parameters_data);
|
||||||
elem[i].flags = Bytes::get_Java_u4(method_parameters_data);
|
method_parameters_data += 2;
|
||||||
method_parameters_data += 4;
|
|
||||||
} else {
|
|
||||||
elem[i].flags = Bytes::get_Java_u2(method_parameters_data);
|
|
||||||
method_parameters_data += 2;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -315,14 +315,18 @@ Handle java_lang_String::char_converter(Handle java_string, jchar from_char, jch
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
jchar* java_lang_String::as_unicode_string(oop java_string, int& length) {
|
jchar* java_lang_String::as_unicode_string(oop java_string, int& length, TRAPS) {
|
||||||
typeArrayOop value = java_lang_String::value(java_string);
|
typeArrayOop value = java_lang_String::value(java_string);
|
||||||
int offset = java_lang_String::offset(java_string);
|
int offset = java_lang_String::offset(java_string);
|
||||||
length = java_lang_String::length(java_string);
|
length = java_lang_String::length(java_string);
|
||||||
|
|
||||||
jchar* result = NEW_RESOURCE_ARRAY(jchar, length);
|
jchar* result = NEW_RESOURCE_ARRAY_RETURN_NULL(jchar, length);
|
||||||
for (int index = 0; index < length; index++) {
|
if (result != NULL) {
|
||||||
result[index] = value->char_at(index + offset);
|
for (int index = 0; index < length; index++) {
|
||||||
|
result[index] = value->char_at(index + offset);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
THROW_MSG_0(vmSymbols::java_lang_OutOfMemoryError(), "could not allocate Unicode string");
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,7 +153,7 @@ class java_lang_String : AllStatic {
|
||||||
static char* as_utf8_string(oop java_string, char* buf, int buflen);
|
static char* as_utf8_string(oop java_string, char* buf, int buflen);
|
||||||
static char* as_utf8_string(oop java_string, int start, int len);
|
static char* as_utf8_string(oop java_string, int start, int len);
|
||||||
static char* as_platform_dependent_str(Handle java_string, TRAPS);
|
static char* as_platform_dependent_str(Handle java_string, TRAPS);
|
||||||
static jchar* as_unicode_string(oop java_string, int& length);
|
static jchar* as_unicode_string(oop java_string, int& length, TRAPS);
|
||||||
// produce an ascii string with all other values quoted using \u####
|
// produce an ascii string with all other values quoted using \u####
|
||||||
static char* as_quoted_ascii(oop java_string);
|
static char* as_quoted_ascii(oop java_string);
|
||||||
|
|
||||||
|
|
|
@ -735,7 +735,7 @@ oop StringTable::intern(oop string, TRAPS)
|
||||||
ResourceMark rm(THREAD);
|
ResourceMark rm(THREAD);
|
||||||
int length;
|
int length;
|
||||||
Handle h_string (THREAD, string);
|
Handle h_string (THREAD, string);
|
||||||
jchar* chars = java_lang_String::as_unicode_string(string, length);
|
jchar* chars = java_lang_String::as_unicode_string(string, length, CHECK_NULL);
|
||||||
oop result = intern(h_string, chars, length, CHECK_NULL);
|
oop result = intern(h_string, chars, length, CHECK_NULL);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -539,6 +539,9 @@ class ResourceObj ALLOCATION_SUPER_CLASS_SPEC {
|
||||||
#define NEW_RESOURCE_ARRAY(type, size)\
|
#define NEW_RESOURCE_ARRAY(type, size)\
|
||||||
(type*) resource_allocate_bytes((size) * sizeof(type))
|
(type*) resource_allocate_bytes((size) * sizeof(type))
|
||||||
|
|
||||||
|
#define NEW_RESOURCE_ARRAY_RETURN_NULL(type, size)\
|
||||||
|
(type*) resource_allocate_bytes((size) * sizeof(type), AllocFailStrategy::RETURN_NULL)
|
||||||
|
|
||||||
#define NEW_RESOURCE_ARRAY_IN_THREAD(thread, type, size)\
|
#define NEW_RESOURCE_ARRAY_IN_THREAD(thread, type, size)\
|
||||||
(type*) resource_allocate_bytes(thread, (size) * sizeof(type))
|
(type*) resource_allocate_bytes(thread, (size) * sizeof(type))
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -103,11 +103,17 @@ intptr_t oopDesc::slow_identity_hash() {
|
||||||
|
|
||||||
// When String table needs to rehash
|
// When String table needs to rehash
|
||||||
unsigned int oopDesc::new_hash(jint seed) {
|
unsigned int oopDesc::new_hash(jint seed) {
|
||||||
|
EXCEPTION_MARK;
|
||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
int length;
|
int length;
|
||||||
jchar* chars = java_lang_String::as_unicode_string(this, length);
|
jchar* chars = java_lang_String::as_unicode_string(this, length, THREAD);
|
||||||
// Use alternate hashing algorithm on the string
|
if (chars != NULL) {
|
||||||
return AltHashing::murmur3_32(seed, chars, length);
|
// Use alternate hashing algorithm on the string
|
||||||
|
return AltHashing::murmur3_32(seed, chars, length);
|
||||||
|
} else {
|
||||||
|
vm_exit_out_of_memory(length, "unable to create Unicode strings for String table rehash");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VerifyOopClosure VerifyOopClosure::verify_oop;
|
VerifyOopClosure VerifyOopClosure::verify_oop;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -310,12 +310,8 @@ WB_END
|
||||||
WB_ENTRY(jboolean, WB_IsInStringTable(JNIEnv* env, jobject o, jstring javaString))
|
WB_ENTRY(jboolean, WB_IsInStringTable(JNIEnv* env, jobject o, jstring javaString))
|
||||||
ResourceMark rm(THREAD);
|
ResourceMark rm(THREAD);
|
||||||
int len;
|
int len;
|
||||||
jchar* name = java_lang_String::as_unicode_string(JNIHandles::resolve(javaString), len);
|
jchar* name = java_lang_String::as_unicode_string(JNIHandles::resolve(javaString), len, CHECK_false);
|
||||||
oop found_string = StringTable::the_table()->lookup(name, len);
|
return (StringTable::lookup(name, len) != NULL);
|
||||||
if (found_string == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
WB_END
|
WB_END
|
||||||
|
|
||||||
|
|
||||||
|
@ -324,6 +320,11 @@ WB_ENTRY(void, WB_FullGC(JNIEnv* env, jobject o))
|
||||||
Universe::heap()->collect(GCCause::_last_ditch_collection);
|
Universe::heap()->collect(GCCause::_last_ditch_collection);
|
||||||
WB_END
|
WB_END
|
||||||
|
|
||||||
|
|
||||||
|
WB_ENTRY(jlong, WB_ReserveMemory(JNIEnv* env, jobject o, jlong size))
|
||||||
|
return (jlong)os::reserve_memory(size, NULL, 0);
|
||||||
|
WB_END
|
||||||
|
|
||||||
//Some convenience methods to deal with objects from java
|
//Some convenience methods to deal with objects from java
|
||||||
int WhiteBox::offset_for_field(const char* field_name, oop object,
|
int WhiteBox::offset_for_field(const char* field_name, oop object,
|
||||||
Symbol* signature_symbol) {
|
Symbol* signature_symbol) {
|
||||||
|
@ -425,6 +426,8 @@ static JNINativeMethod methods[] = {
|
||||||
CC"(Ljava/lang/reflect/Executable;)V", (void*)&WB_ClearMethodState},
|
CC"(Ljava/lang/reflect/Executable;)V", (void*)&WB_ClearMethodState},
|
||||||
{CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable },
|
{CC"isInStringTable", CC"(Ljava/lang/String;)Z", (void*)&WB_IsInStringTable },
|
||||||
{CC"fullGC", CC"()V", (void*)&WB_FullGC },
|
{CC"fullGC", CC"()V", (void*)&WB_FullGC },
|
||||||
|
|
||||||
|
{CC"reserveMemory", CC"(J)J", (void*)&WB_ReserveMemory },
|
||||||
};
|
};
|
||||||
|
|
||||||
#undef CC
|
#undef CC
|
||||||
|
|
78
hotspot/test/runtime/memory/ReserveMemory.java
Normal file
78
hotspot/test/runtime/memory/ReserveMemory.java
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013, Oracle 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.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* @key regression
|
||||||
|
* @bug 8012015
|
||||||
|
* @summary Make sure reserved (but uncommitted) memory is not accessible
|
||||||
|
* @library /testlibrary /testlibrary/whitebox
|
||||||
|
* @build ReserveMemory
|
||||||
|
* @run main ClassFileInstaller sun.hotspot.WhiteBox
|
||||||
|
* @run main ReserveMemory
|
||||||
|
*/
|
||||||
|
|
||||||
|
import com.oracle.java.testlibrary.*;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import sun.hotspot.WhiteBox;
|
||||||
|
import sun.misc.Unsafe;
|
||||||
|
|
||||||
|
public class ReserveMemory {
|
||||||
|
private static Unsafe getUnsafe() throws Exception {
|
||||||
|
Field f = Unsafe.class.getDeclaredField("theUnsafe");
|
||||||
|
f.setAccessible(true);
|
||||||
|
return (Unsafe)f.get(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isWindows() {
|
||||||
|
return System.getProperty("os.name").toLowerCase().startsWith("win");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String args[]) throws Exception {
|
||||||
|
if (args.length > 0) {
|
||||||
|
long address = WhiteBox.getWhiteBox().reserveMemory(4096);
|
||||||
|
|
||||||
|
System.out.println("Reserved memory at address: 0x" + Long.toHexString(address));
|
||||||
|
System.out.println("Will now read from the address, expecting a crash!");
|
||||||
|
|
||||||
|
int x = getUnsafe().getInt(address);
|
||||||
|
|
||||||
|
throw new Exception("Read of reserved/uncommitted memory unexpectedly succeeded, expected crash!");
|
||||||
|
}
|
||||||
|
|
||||||
|
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
|
||||||
|
"-Xbootclasspath/a:.",
|
||||||
|
"-XX:+UnlockDiagnosticVMOptions",
|
||||||
|
"-XX:+WhiteBoxAPI",
|
||||||
|
"ReserveMemory",
|
||||||
|
"test");
|
||||||
|
|
||||||
|
OutputAnalyzer output = new OutputAnalyzer(pb.start());
|
||||||
|
if (isWindows()) {
|
||||||
|
output.shouldContain("EXCEPTION_ACCESS_VIOLATION");
|
||||||
|
} else {
|
||||||
|
output.shouldContain("SIGSEGV");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -111,6 +111,9 @@ public class WhiteBox {
|
||||||
// Intered strings
|
// Intered strings
|
||||||
public native boolean isInStringTable(String str);
|
public native boolean isInStringTable(String str);
|
||||||
|
|
||||||
|
// Memory
|
||||||
|
public native long reserveMemory(long size);
|
||||||
|
|
||||||
// force Full GC
|
// force Full GC
|
||||||
public native void fullGC();
|
public native void fullGC();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue