From da40f95efa58534d6f59dff11f8c9dbbbbb68520 Mon Sep 17 00:00:00 2001 From: Jerome Leclanche Date: Thu, 19 Aug 2010 14:30:49 +0100 Subject: [PATCH] gdi32: Properly set ERROR_NOACCESS when GetObject receives invalid arguments. --- dlls/gdi32/gdiobj.c | 14 ++++++++++++-- dlls/gdi32/tests/gdiobj.c | 8 ++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/dlls/gdi32/gdiobj.c b/dlls/gdi32/gdiobj.c index 3f84f9c404a..a941e2b12ba 100644 --- a/dlls/gdi32/gdiobj.c +++ b/dlls/gdi32/gdiobj.c @@ -973,7 +973,12 @@ INT WINAPI GetObjectA( HGDIOBJ handle, INT count, LPVOID buffer ) GDI_ReleaseObj( handle ); if (funcs && funcs->pGetObjectA) - result = funcs->pGetObjectA( handle, count, buffer ); + { + if (buffer && ((ULONG_PTR)buffer >> 16) == 0) /* catch apps getting argument order wrong */ + SetLastError( ERROR_NOACCESS ); + else + result = funcs->pGetObjectA( handle, count, buffer ); + } else SetLastError( ERROR_INVALID_HANDLE ); @@ -995,7 +1000,12 @@ INT WINAPI GetObjectW( HGDIOBJ handle, INT count, LPVOID buffer ) GDI_ReleaseObj( handle ); if (funcs && funcs->pGetObjectW) - result = funcs->pGetObjectW( handle, count, buffer ); + { + if (buffer && ((ULONG_PTR)buffer >> 16) == 0) /* catch apps getting argument order wrong */ + SetLastError( ERROR_NOACCESS ); + else + result = funcs->pGetObjectW( handle, count, buffer ); + } else SetLastError( ERROR_INVALID_HANDLE ); diff --git a/dlls/gdi32/tests/gdiobj.c b/dlls/gdi32/tests/gdiobj.c index c1adc0f57f9..7302134fa4a 100644 --- a/dlls/gdi32/tests/gdiobj.c +++ b/dlls/gdi32/tests/gdiobj.c @@ -81,6 +81,14 @@ static void test_gdi_objects(void) "GetObject(NULL obj), expected 0, NO_ERROR, got %d, %u\n", i, GetLastError()); + /* GetObject expects ERROR_NOACCESS when passed an invalid buffer */ + hp = SelectObject(hdc, GetStockObject(BLACK_PEN)); + SetLastError(0); + i = GetObjectA(hp, (INT_PTR)buff, (LPVOID)sizeof(buff)); + ok (!i && GetLastError() == ERROR_NOACCESS, + "GetObject(invalid buff), expected 0, ERROR_NOACCESS, got %d, %u\n", + i, GetLastError()); + /* GetObjectType does SetLastError() on a null object */ SetLastError(0); i = GetObjectType(NULL);