From 476e7e54cb24774919537d963140eb19cb66ac9d Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Wed, 19 Mar 2025 20:35:54 -0700
Subject: [PATCH] Don't create surfaces with invalid pixel formats
Fixes https://github.com/libsdl-org/SDL/issues/12556
---
src/video/SDL_surface.c | 10 ++++++++++
test/testautomation_surface.c | 23 +++++++++++++++++++++++
2 files changed, 33 insertions(+)
diff --git a/src/video/SDL_surface.c b/src/video/SDL_surface.c
index cfd96d1723a95..4a616f9c9f6d4 100644
--- a/src/video/SDL_surface.c
+++ b/src/video/SDL_surface.c
@@ -204,6 +204,11 @@ SDL_Surface *SDL_CreateSurface(int width, int height, SDL_PixelFormat format)
return NULL;
}
+ if (format == SDL_PIXELFORMAT_UNKNOWN) {
+ SDL_InvalidParamError("format");
+ return NULL;
+ }
+
if (!SDL_CalculateSurfaceSize(format, width, height, &size, &pitch, false /* not minimal pitch */)) {
// Overflow...
return NULL;
@@ -250,6 +255,11 @@ SDL_Surface *SDL_CreateSurfaceFrom(int width, int height, SDL_PixelFormat format
return NULL;
}
+ if (format == SDL_PIXELFORMAT_UNKNOWN) {
+ SDL_InvalidParamError("format");
+ return NULL;
+ }
+
if (pitch == 0 && !pixels) {
// The application will fill these in later with valid values
} else {
diff --git a/test/testautomation_surface.c b/test/testautomation_surface.c
index ea480f8396647..3b840039d8573 100644
--- a/test/testautomation_surface.c
+++ b/test/testautomation_surface.c
@@ -313,6 +313,24 @@ static void AssertFileExist(const char *filename)
/* Test case functions */
+/**
+ * Tests creating surface with invalid format
+ */
+static int SDLCALL surface_testInvalidFormat(void *arg)
+{
+ SDL_Surface *surface;
+
+ surface = SDL_CreateSurface(32, 32, SDL_PIXELFORMAT_UNKNOWN);
+ SDLTest_AssertCheck(surface == NULL, "Verify SDL_CreateSurface(SDL_PIXELFORMAT_UNKNOWN) returned NULL");
+ SDL_DestroySurface(surface);
+
+ surface = SDL_CreateSurfaceFrom(32, 32, SDL_PIXELFORMAT_UNKNOWN, NULL, 0);
+ SDLTest_AssertCheck(surface == NULL, "Verify SDL_CreateSurfaceFrom(SDL_PIXELFORMAT_UNKNOWN) returned NULL");
+ SDL_DestroySurface(surface);
+
+ return TEST_COMPLETED;
+}
+
/**
* Tests sprite saving and loading
*/
@@ -1542,6 +1560,10 @@ static int SDLCALL surface_testScale(void *arg)
/* ================= Test References ================== */
/* Surface test cases */
+static const SDLTest_TestCaseReference surfaceTestInvalidFormat = {
+ surface_testInvalidFormat, "surface_testInvalidFormat", "Tests creating surface with invalid format", TEST_ENABLED
+};
+
static const SDLTest_TestCaseReference surfaceTestSaveLoadBitmap = {
surface_testSaveLoadBitmap, "surface_testSaveLoadBitmap", "Tests sprite saving and loading.", TEST_ENABLED
};
@@ -1640,6 +1662,7 @@ static const SDLTest_TestCaseReference surfaceTestScale = {
/* Sequence of Surface test cases */
static const SDLTest_TestCaseReference *surfaceTests[] = {
+ &surfaceTestInvalidFormat,
&surfaceTestSaveLoadBitmap,
&surfaceTestBlitZeroSource,
&surfaceTestBlit,