Alexandre Julliard : kernel32/tests: Add tests for tail checking on large heap blocks.

Alexandre Julliard julliard at winehq.org
Tue Jan 26 11:21:10 CST 2010


Module: wine
Branch: master
Commit: 356b06faea73d43c682d1ff2523ef37b020f15d7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=356b06faea73d43c682d1ff2523ef37b020f15d7

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Jan 26 16:08:49 2010 +0100

kernel32/tests: Add tests for tail checking on large heap blocks.

---

 dlls/kernel32/tests/heap.c |   47 +++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 46 insertions(+), 1 deletions(-)

diff --git a/dlls/kernel32/tests/heap.c b/dlls/kernel32/tests/heap.c
index 11a11a5..81850fe 100644
--- a/dlls/kernel32/tests/heap.c
+++ b/dlls/kernel32/tests/heap.c
@@ -488,7 +488,7 @@ static void test_heap_checks( DWORD flags )
 {
     BYTE old, *p, *p2;
     BOOL ret;
-    SIZE_T size;
+    SIZE_T size, large_size = 800 * 1024 + 37;
 
     if (flags & HEAP_PAGE_ALLOCS) return;  /* no tests for that case yet */
     trace( "testing heap flags %08x\n", flags );
@@ -595,6 +595,51 @@ static void test_heap_checks( DWORD flags )
         ret = HeapValidate( GetProcessHeap(), 0, NULL );
         ok( ret, "HeapValidate failed\n" );
     }
+
+    /* now test large blocks */
+
+    p = HeapAlloc( GetProcessHeap(), 0, large_size );
+    ok( p != NULL, "HeapAlloc failed\n" );
+
+    ret = HeapValidate( GetProcessHeap(), 0, p );
+    ok( ret, "HeapValidate failed\n" );
+
+    size = HeapSize( GetProcessHeap(), 0, p );
+    ok( size == large_size, "Wrong size %lu\n", size );
+
+    ok( p[large_size - 2] == 0, "wrong data %x\n", p[large_size - 2] );
+    ok( p[large_size - 1] == 0, "wrong data %x\n", p[large_size - 1] );
+
+    if (flags & HEAP_TAIL_CHECKING_ENABLED)
+    {
+        /* Windows doesn't do tail checking on large blocks */
+        ok( p[large_size] == 0xab || broken(p[large_size] == 0), "wrong data %x\n", p[large_size] );
+        ok( p[large_size+1] == 0xab || broken(p[large_size+1] == 0), "wrong data %x\n", p[large_size+1] );
+        ok( p[large_size+2] == 0xab || broken(p[large_size+2] == 0), "wrong data %x\n", p[large_size+2] );
+        if (p[large_size] == 0xab)
+        {
+            p[large_size] = 0xcc;
+            ret = HeapValidate( GetProcessHeap(), 0, p );
+            ok( !ret, "HeapValidate succeeded\n" );
+
+            /* other calls only check when HEAP_VALIDATE is set */
+            if (flags & HEAP_VALIDATE)
+            {
+                size = HeapSize( GetProcessHeap(), 0, p );
+                ok( size == ~(SIZE_T)0, "Wrong size %lu\n", size );
+
+                p2 = HeapReAlloc( GetProcessHeap(), 0, p, large_size - 3 );
+                ok( p2 == NULL, "HeapReAlloc succeeded\n" );
+
+                ret = HeapFree( GetProcessHeap(), 0, p );
+                ok( !ret, "HeapFree succeeded\n" );
+            }
+            p[large_size] = 0xab;
+        }
+    }
+
+    ret = HeapFree( GetProcessHeap(), 0, p );
+    ok( ret, "HeapFree failed\n" );
 }
 
 static void test_debug_heap( const char *argv0, DWORD flags )




More information about the wine-cvs mailing list