RFR (L): JDK-6843347 Boundary values in some public GC options cause crashes

Thomas Schatzl thomas.schatzl at oracle.com
Fri May 3 08:46:03 UTC 2013


Hi all,

  please review the following change that adds argument checking for
many non-boolean GC related options to avoid crashes, DOSes etc. when
passing particular option values.
The change only covers values accessible in a product build (product,
diagnostic, experimental and managed or so globals).

Bugs.sun
http://bugs.sun.com/view_bug.do?bug_id=6843347

JBS:
https://jbs.oracle.com/bugs/browse/JDK-6843347

Webrev:
http://cr.openjdk.java.net/~tschatzl/6843347/webrev/

Testing:
jprt

Following is a list stating the reason for the particular check for each
changed global variable. Note that these changes also resulted in (one
or two) simplifications in code (e.g. checks/asserts that a int variable
is larger than zero). For most variables the problem is actually easy to
spot if you look for such errors, only some are more tricky. This
information is presented here.

NUMAInterleaveGranularity - must be > 0, task sizing, crash at
os_windows.cpp:2866
NUMAPageScanRate - negative value gives an overflow in
MutableNUMASpace::scan_pages(); intx->uintx
NUMAChunkResizeWeight - percentage boundary check; intx->uintx
NUMASpaceResizeRate - negative value gives overflow in
MutableNUMASpace::initialize() and other errors following; intx->uintx

LogEventsBufferEntries - used to size buffer that is allocated on the
heap, must be > 0; intx->uintx
HeapSizePerGCThread - used as divisor
GCTaskTimeStampEntries - used to size buffer allocated on the heap

ParallelGCBufferWastePct - overflow and degraded performance;
percentage; intx->uintx
TargetPLABWastePct - percentage; used as divisor; intx->uintx

ParGCStridesPerThread - used as divisor in
CardTableModRefBS::process_stride(); used for task sizing, must be > 0
ParGCCardsPerStrideChunk - incorrect operation in
CardTableModRefBS::process_stride()

CMSOldPLABNumRefills - used as divisor
CMSOldPLABToleranceFactor - used as divisor

CMSOldPLABMin - results in use in divisor (and failing assertion)
CMSOldPLABMax - results in use in divisor (and failing assertion)

CMSYoungGenPerWorker - must be > 0, although it results in nothing
serious since other safeguards help, but is unexpected. intx->uintx
CMS_FLSWeight - percentage

FLSCoalescePolicy - invalid value gives ShouldNotReachHere()

CMS_SweepWeight - percentage

CMSMaxAbortablePrecleanTime - time span, should not be negative

CMSRescanMultiple - used for task sizing, should be > 0
CMSConcMarkMultiple - used for task sizing, should be > 0

CMSPrecleanIter - must be < 10, fails assertion otherwise
CMSPrecleanDenominator, CMSPrecleanNumerator - other values fail
assertion in concurrentMarkSweepGeneration
CMSScheduleRemarkEdenPenetration - percentage
CMSScheduleRemarkSamplingRatio - must be > 0, div by zero otherwise
CMSBitMapYieldQuantum - used for task sizing, should be > 0
CMSTriggerRatio - percentage
CMSIsTooFullPercentage - percentage

YoungGenerationSizeSupplementDecay - must be > 0, div by zero otherwise
TenuredGenerationSizeSupplementDecay - must be > 0, div by zero
otherwise

WorkStealingSleepMillis - intx->uintx

MinRAMFraction - must be > 0, div by zero otherwise
InitialRAMFraction - ""
MaxRAMFraction - ""
DefaultMaxRAMFraction - ""

AdaptiveTimeWeight - percentage
AdaptiveSizeDecrementScaleFactor - must be > 0, div by zero otherwise

MinTLABSize - must be > 0, buffer allocation
TLABRefillWasteFraction - must be > 0, div by zero otherwise

MaxTenuringThreshold - 4 bit size limitation due to available storage
InitialTenuringThreshold - must be 0 <= x <= MaxTenuringThreshold
TargetSurvivorRatio - percentage
MarkSweepDeadRatio - percentage

MarkSweepAlwaysCompactCount - must be > 0, division by zero otherwise.
Note that previously there has been code at the location where it was
used that checked for zero values; now the argument processing fixes up
the value as necessary. intx->uintx

QueuedAllocationWarningCount - intx->uintx

ParallelOldDeadWoodLimiterMean - documentation mentions value from
0..100
ParallelOldDeadWoodLimiterStdDev - documentation mentions value from
0..100

ParallelOldGCSplitInterval - used as divisor

Thanks,
Thomas





More information about the hotspot-gc-dev mailing list