From 89d7d406ab1f0033ecdd5837b1fce4da69bef260 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 22 Apr 2025 13:05:38 -0700 Subject: [PATCH] Added tests to cover invalid surface blits Reproduction case for https://github.com/libsdl-org/SDL/issues/12844 --- test/testautomation_surface.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/test/testautomation_surface.c b/test/testautomation_surface.c index 3b840039d8..d338230922 100644 --- a/test/testautomation_surface.c +++ b/test/testautomation_surface.c @@ -959,6 +959,36 @@ static int SDLCALL surface_testBlitBlendMul(void *arg) return TEST_COMPLETED; } +/** + * Tests blitting invalid surfaces. + */ +static int SDLCALL surface_testBlitInvalid(void *arg) +{ + SDL_Surface *valid, *invalid; + bool result; + + valid = SDL_CreateSurface(1, 1, SDL_PIXELFORMAT_RGBA8888); + SDLTest_AssertCheck(valid != NULL, "Check surface creation"); + invalid = SDL_CreateSurface(0, 0, SDL_PIXELFORMAT_RGBA8888); + SDLTest_AssertCheck(invalid != NULL, "Check surface creation"); + SDLTest_AssertCheck(invalid->pixels == NULL, "Check surface pixels are NULL"); + + result = SDL_BlitSurface(invalid, NULL, valid, NULL); + SDLTest_AssertCheck(result == true, "SDL_BlitSurface(invalid, NULL, valid, NULL), result = %s\n", result ? "true" : "false"); + result = SDL_BlitSurface(valid, NULL, invalid, NULL); + SDLTest_AssertCheck(result == true, "SDL_BlitSurface(valid, NULL, invalid, NULL), result = %s\n", result ? "true" : "false"); + + result = SDL_BlitSurfaceScaled(invalid, NULL, valid, NULL, SDL_SCALEMODE_NEAREST); + SDLTest_AssertCheck(result == false, "SDL_BlitSurfaceScaled(invalid, NULL, valid, NULL, SDL_SCALEMODE_NEAREST), result = %s\n", result ? "true" : "false"); + result = SDL_BlitSurfaceScaled(valid, NULL, invalid, NULL, SDL_SCALEMODE_NEAREST); + SDLTest_AssertCheck(result == false, "SDL_BlitSurfaceScaled(valid, NULL, invalid, NULL, SDL_SCALEMODE_NEAREST), result = %s\n", result ? "true" : "false"); + + SDL_DestroySurface(valid); + SDL_DestroySurface(invalid); + + return TEST_COMPLETED; +} + static int SDLCALL surface_testOverflow(void *arg) { char buf[1024]; @@ -1632,6 +1662,10 @@ static const SDLTest_TestCaseReference surfaceTestBlitBlendMul = { surface_testBlitBlendMul, "surface_testBlitBlendMul", "Tests blitting routines with mul blending mode.", TEST_ENABLED }; +static const SDLTest_TestCaseReference surfaceTestBlitInvalid = { + surface_testBlitInvalid, "surface_testBlitInvalid", "Tests blitting routines with invalid surfaces.", TEST_ENABLED +}; + static const SDLTest_TestCaseReference surfaceTestOverflow = { surface_testOverflow, "surface_testOverflow", "Test overflow detection.", TEST_ENABLED }; @@ -1680,6 +1714,7 @@ static const SDLTest_TestCaseReference *surfaceTests[] = { &surfaceTestBlitBlendAddPremultiplied, &surfaceTestBlitBlendMod, &surfaceTestBlitBlendMul, + &surfaceTestBlitInvalid, &surfaceTestOverflow, &surfaceTestFlip, &surfaceTestPalette,