6808322: ParNew, CMS, G1: ParGCAllocBuffer overflow
authorysr
Fri, 13 Mar 2009 13:56:01 -0700
changeset 2246 3c71d9b4b8e6
parent 2244 2f308c52f0a5
child 2247 5aa1d789109a
6808322: ParNew, CMS, G1: ParGCAllocBuffer overflow Summary: Correct the overflow check in ParGCAllocBuffer::allocate(); simplify ParGCAllocBuffer::undo_allocation(). Reviewed-by: apetrusenko, jcoomes, jmasa, minqi, phh, tonyp
hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.hpp
--- a/hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.hpp	Thu Mar 12 14:01:36 2009 -0700
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parGCAllocBuffer.hpp	Fri Mar 13 13:56:01 2009 -0700
@@ -63,9 +63,8 @@
   // return NULL.
   HeapWord* allocate(size_t word_sz) {
     HeapWord* res = _top;
-    HeapWord* new_top = _top + word_sz;
-    if (new_top <= _end) {
-      _top = new_top;
+    if (pointer_delta(_end, _top) >= word_sz) {
+      _top = _top + word_sz;
       return res;
     } else {
       return NULL;
@@ -75,10 +74,9 @@
   // Undo the last allocation in the buffer, which is required to be of the
   // "obj" of the given "word_sz".
   void undo_allocation(HeapWord* obj, size_t word_sz) {
-    assert(_top - word_sz >= _bottom
-           && _top - word_sz == obj,
-           "Bad undo_allocation");
-    _top = _top - word_sz;
+    assert(pointer_delta(_top, _bottom) >= word_sz, "Bad undo");
+    assert(pointer_delta(_top, obj)     == word_sz, "Bad undo");
+    _top = obj;
   }
 
   // The total (word) size of the buffer, including both allocated and