Alexandre Julliard : gdi32: Add more parameter checks in GdiGradientFill.

Alexandre Julliard julliard at winehq.org
Mon Dec 5 14:55:02 CST 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Dec  1 18:08:09 2011 +0100

gdi32: Add more parameter checks in GdiGradientFill.

---

 dlls/gdi32/painting.c     |    7 +++++--
 dlls/gdi32/tests/bitmap.c |   29 +++++++++++++++++++++++++++++
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/dlls/gdi32/painting.c b/dlls/gdi32/painting.c
index 75c32c8..d721bd1 100644
--- a/dlls/gdi32/painting.c
+++ b/dlls/gdi32/painting.c
@@ -1219,11 +1219,12 @@ POINT *GDI_Bezier( const POINT *Points, INT count, INT *nPtsOut )
  *           GdiGradientFill   (GDI32.@)
  */
 BOOL WINAPI GdiGradientFill( HDC hdc, TRIVERTEX *vert_array, ULONG nvert,
-                          void * grad_array, ULONG ngrad, ULONG mode )
+                             void *grad_array, ULONG ngrad, ULONG mode )
 {
     DC *dc;
     PHYSDEV physdev;
     BOOL ret;
+    ULONG i;
 
     TRACE("%p vert_array:%p nvert:%d grad_array:%p ngrad:%d\n", hdc, vert_array, nvert, grad_array, ngrad);
 
@@ -1232,12 +1233,14 @@ BOOL WINAPI GdiGradientFill( HDC hdc, TRIVERTEX *vert_array, ULONG nvert,
         SetLastError( ERROR_INVALID_PARAMETER );
         return FALSE;
     }
+    for (i = 0; i < ngrad * (mode == GRADIENT_FILL_TRIANGLE ? 3 : 2); i++)
+        if (((ULONG *)grad_array)[i] >= nvert) return FALSE;
+
     if (!(dc = get_dc_ptr( hdc )))
     {
         SetLastError( ERROR_INVALID_PARAMETER );
         return FALSE;
     }
-
     update_dc( dc );
     physdev = GET_DC_PHYSDEV( dc, pGradientFill );
     ret = physdev->funcs->pGradientFill( physdev, vert_array, nvert, grad_array, ngrad, mode );
diff --git a/dlls/gdi32/tests/bitmap.c b/dlls/gdi32/tests/bitmap.c
index 8b62be6..26c840b 100644
--- a/dlls/gdi32/tests/bitmap.c
+++ b/dlls/gdi32/tests/bitmap.c
@@ -3417,6 +3417,17 @@ static void test_GdiGradientFill(void)
     ok( !ret, "GdiGradientFill succeeded\n" );
     ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
     SetLastError( 0xdeadbeef );
+    ret = pGdiGradientFill( hdc, vt, 3, rect, 3, GRADIENT_FILL_RECT_H );
+    ok( !ret, "GdiGradientFill succeeded\n" );
+    ok( GetLastError() == 0xdeadbeef, "wrong error %u\n", GetLastError() );
+    rect[2].UpperLeft = rect[2].LowerRight = 1;
+    SetLastError( 0xdeadbeef );
+    ret = pGdiGradientFill( hdc, vt, 3, rect, 3, GRADIENT_FILL_RECT_H );
+    ok( ret, "GdiGradientFill failed err %u\n", GetLastError() );
+    SetLastError( 0xdeadbeef );
+    ret = pGdiGradientFill( hdc, vt, 1, rect, 1, GRADIENT_FILL_RECT_H );
+    ok( ret, "GdiGradientFill failed err %u\n", GetLastError() );
+    SetLastError( 0xdeadbeef );
     ret = pGdiGradientFill( hdc, vt, 1, tri, 0, GRADIENT_FILL_TRIANGLE );
     ok( !ret, "GdiGradientFill succeeded\n" );
     ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
@@ -3429,6 +3440,24 @@ static void test_GdiGradientFill(void)
     SetLastError( 0xdeadbeef );
     ret = pGdiGradientFill( hdc, vt, 3, tri, 3, GRADIENT_FILL_TRIANGLE );
     ok( ret, "GdiGradientFill failed err %u\n", GetLastError() );
+    SetLastError( 0xdeadbeef );
+    ret = pGdiGradientFill( hdc, vt, 3, tri, 4, GRADIENT_FILL_TRIANGLE );
+    ok( !ret, "GdiGradientFill succeeded\n" );
+    ok( GetLastError() == 0xdeadbeef, "wrong error %u\n", GetLastError() );
+    tri[3].Vertex3 = 1;
+    SetLastError( 0xdeadbeef );
+    ret = pGdiGradientFill( hdc, vt, 3, tri, 4, GRADIENT_FILL_TRIANGLE );
+    ok( !ret, "GdiGradientFill succeeded\n" );
+    ok( GetLastError() == 0xdeadbeef, "wrong error %u\n", GetLastError() );
+    tri[3].Vertex3 = 0;
+    SetLastError( 0xdeadbeef );
+    ret = pGdiGradientFill( hdc, vt, 3, tri, 4, GRADIENT_FILL_TRIANGLE );
+    ok( !ret, "GdiGradientFill succeeded\n" );
+    ok( GetLastError() == 0xdeadbeef, "wrong error %u\n", GetLastError() );
+    tri[3].Vertex1 = tri[3].Vertex2 = tri[3].Vertex3 = 1;
+    SetLastError( 0xdeadbeef );
+    ret = pGdiGradientFill( hdc, vt, 3, tri, 4, GRADIENT_FILL_TRIANGLE );
+    ok( ret, "GdiGradientFill failed err %u\n", GetLastError() );
 
     DeleteDC( hdc );
     DeleteObject( bmp );




More information about the wine-cvs mailing list