From ca96aed384709aca388c7a4f76a1d6422087d583 Mon Sep 17 00:00:00 2001 From: Andrew Nguyen Date: Tue, 3 Aug 2010 07:07:59 -0500 Subject: [PATCH] gdi32: Improve AddFontMemResourceEx parameter validation. --- dlls/gdi32/font.c | 6 ++++ dlls/gdi32/tests/font.c | 78 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c index 9ebf7b37d9e..133681ca6cc 100644 --- a/dlls/gdi32/font.c +++ b/dlls/gdi32/font.c @@ -3188,6 +3188,12 @@ HANDLE WINAPI AddFontMemResourceEx( PVOID pbFont, DWORD cbFont, PVOID pdv, DWORD HANDLE ret; DWORD num_fonts; + if (!pbFont || !cbFont || !pcFonts) + { + SetLastError(ERROR_INVALID_PARAMETER); + return NULL; + } + ret = WineEngAddFontMemResourceEx(pbFont, cbFont, pdv, &num_fonts); if (ret) { diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c index bbb54cd44fd..fa4836042a1 100644 --- a/dlls/gdi32/tests/font.c +++ b/dlls/gdi32/tests/font.c @@ -3185,6 +3185,8 @@ static void test_AddFontMemResource(void) void *font; DWORD font_size, num_fonts; HANDLE ret; + DEVMODEA dmA; + BOOL is_winxp; if (!pAddFontMemResourceEx || !pRemoveFontMemResourceEx) { @@ -3199,6 +3201,74 @@ static void test_AddFontMemResource(void) return; } + is_winxp = EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &dmA) && + (dmA.dmFields & DM_DISPLAYORIENTATION); + + if (is_winxp) + { + SetLastError(0xdeadbeef); + ret = pAddFontMemResourceEx(NULL, 0, NULL, NULL); + ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + SetLastError(0xdeadbeef); + ret = pAddFontMemResourceEx(NULL, 10, NULL, NULL); + ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + SetLastError(0xdeadbeef); + ret = pAddFontMemResourceEx(NULL, 0, NULL, &num_fonts); + ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + SetLastError(0xdeadbeef); + ret = pAddFontMemResourceEx(NULL, 10, NULL, &num_fonts); + ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + SetLastError(0xdeadbeef); + ret = pAddFontMemResourceEx(font, 0, NULL, NULL); + ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + SetLastError(0xdeadbeef); + ret = pAddFontMemResourceEx(font, 10, NULL, NULL); + ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + num_fonts = 0xdeadbeef; + SetLastError(0xdeadbeef); + ret = pAddFontMemResourceEx(font, 0, NULL, &num_fonts); + ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + ok(num_fonts == 0xdeadbeef, "number of loaded fonts should be 0xdeadbeef\n"); + + num_fonts = 0xdeadbeef; + SetLastError(0xdeadbeef); + ret = pAddFontMemResourceEx(font, 10, NULL, &num_fonts); + ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == 0xdeadbeef, + "Expected GetLastError() to return 0xdeadbeef, got %u\n", + GetLastError()); + ok(num_fonts == 0xdeadbeef, "number of loaded fonts should be 0xdeadbeef\n"); + } + else + win_skip("AddFontMemResourceEx invalid parameter tests are problematic on Win2k\n"); + num_fonts = 0xdeadbeef; SetLastError(0xdeadbeef); ret = pAddFontMemResourceEx(font, font_size, NULL, &num_fonts); @@ -3215,11 +3285,19 @@ static void test_AddFontMemResource(void) font = load_font("sserife.fon", &font_size); ok(font != NULL, "Unable to locate and load font sserife.fon\n"); + SetLastError(0xdeadbeef); ret = pAddFontMemResourceEx(font, font_size, NULL, (void *)0xdeadbeef); ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == 0xdeadbeef, + "Expected GetLastError() to return 0xdeadbeef, got %u\n", + GetLastError()); + SetLastError(0xdeadbeef); ret = pAddFontMemResourceEx(font, font_size, NULL, NULL); ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); free_font(font); }