# HG changeset patch # User hseigel # Date 1352753891 18000 # Node ID e4f764ddb06aa23a1f705e9d7e2cc13ba29ee01c # Parent 8c413497f434561c78909c886f6cbeefb0780e73 7122219: Passed StringTableSize value not verified Summary: Check that the values specified for -XX:StringTableSize are within a certain range. Reviewed-by: dholmes, coleenp diff -r 8c413497f434 -r e4f764ddb06a src/share/vm/classfile/symbolTable.hpp --- a/src/share/vm/classfile/symbolTable.hpp Fri Nov 09 22:22:53 2012 -0800 +++ b/src/share/vm/classfile/symbolTable.hpp Mon Nov 12 15:58:11 2012 -0500 @@ -262,19 +262,14 @@ // The string table static StringTable* the_table() { return _the_table; } + // Size of one bucket in the string table. Used when checking for rollover. + static uint bucket_size() { return sizeof(HashtableBucket); } + static void create_table() { assert(_the_table == NULL, "One string table allowed."); _the_table = new StringTable(); } - static void create_table(HashtableBucket* t, int length, - int number_of_entries) { - assert(_the_table == NULL, "One string table allowed."); - assert((size_t)length == StringTableSize * sizeof(HashtableBucket), - "bad shared string size."); - _the_table = new StringTable(t, number_of_entries); - } - // GC support // Delete pointers to otherwise-unreachable objects. static void unlink(BoolObjectClosure* cl); diff -r 8c413497f434 -r e4f764ddb06a src/share/vm/runtime/arguments.cpp --- a/src/share/vm/runtime/arguments.cpp Fri Nov 09 22:22:53 2012 -0800 +++ b/src/share/vm/runtime/arguments.cpp Mon Nov 12 15:58:11 2012 -0500 @@ -24,6 +24,7 @@ #include "precompiled.hpp" #include "classfile/javaAssertions.hpp" +#include "classfile/symbolTable.hpp" #include "compiler/compilerOracle.hpp" #include "memory/allocation.inline.hpp" #include "memory/cardTableRS.hpp" @@ -1844,6 +1845,11 @@ status = status && verify_percentage(MinHeapFreeRatio, "MinHeapFreeRatio"); status = status && verify_percentage(MaxHeapFreeRatio, "MaxHeapFreeRatio"); + // Divide by bucket size to prevent a large size from causing rollover when + // calculating amount of memory needed to be allocated for the String table. + status = status && verify_interval(StringTableSize, defaultStringTableSize, + (max_uintx / StringTable::bucket_size()), "StringTable size"); + if (MinHeapFreeRatio > MaxHeapFreeRatio) { jio_fprintf(defaultStream::error_stream(), "MinHeapFreeRatio (" UINTX_FORMAT ") must be less than or " diff -r 8c413497f434 -r e4f764ddb06a src/share/vm/runtime/globals.hpp --- a/src/share/vm/runtime/globals.hpp Fri Nov 09 22:22:53 2012 -0800 +++ b/src/share/vm/runtime/globals.hpp Mon Nov 12 15:58:11 2012 -0500 @@ -3593,7 +3593,7 @@ diagnostic(bool, PrintDTraceDOF, false, \ "Print the DTrace DOF passed to the system for JSDT probes") \ \ - product(uintx, StringTableSize, 1009, \ + product(uintx, StringTableSize, defaultStringTableSize, \ "Number of buckets in the interned String table") \ \ develop(bool, TraceDefaultMethods, false, \ diff -r 8c413497f434 -r e4f764ddb06a src/share/vm/runtime/os.cpp --- a/src/share/vm/runtime/os.cpp Fri Nov 09 22:22:53 2012 -0800 +++ b/src/share/vm/runtime/os.cpp Mon Nov 12 15:58:11 2012 -0500 @@ -576,7 +576,9 @@ // if NULL is returned the calling functions assume out of memory. size = 1; } - + if (size > size + space_before + space_after) { // Check for rollover. + return NULL; + } NOT_PRODUCT(if (MallocVerifyInterval > 0) check_heap()); u_char* ptr = (u_char*)::malloc(size + space_before + space_after); diff -r 8c413497f434 -r e4f764ddb06a src/share/vm/utilities/globalDefinitions.hpp --- a/src/share/vm/utilities/globalDefinitions.hpp Fri Nov 09 22:22:53 2012 -0800 +++ b/src/share/vm/utilities/globalDefinitions.hpp Mon Nov 12 15:58:11 2012 -0500 @@ -328,6 +328,12 @@ //---------------------------------------------------------------------------------------------------- +// Minimum StringTableSize value + +const int defaultStringTableSize=1009; + + +//---------------------------------------------------------------------------------------------------- // HotSwap - for JVMTI aka Class File Replacement and PopFrame // // Determines whether on-the-fly class replacement and frame popping are enabled.