Fixed rare cursor corruption on Windows

If the cursor was created with a temporary surface that was pointing at external memory, then when the cursor is used it might be referencing memory that had already been freed.
This commit is contained in:
Sam Lantinga
2026-05-05 08:53:01 -07:00
parent 93a5d33386
commit f6f4664ed1

View File

@@ -148,9 +148,23 @@ static SDL_Cursor *WIN_CreateAnimatedCursorAndData(SDL_CursorFrameInfo *frames,
data->hot_y = hot_y;
data->num_frames = frame_count;
for (int i = 0; i < frame_count; ++i) {
data->frames[i].surface = frames[i].surface;
SDL_Surface *surface = frames[i].surface;
if (surface->flags & SDL_SURFACE_PREALLOCATED) {
surface = SDL_DuplicateSurface(surface);
if (!surface) {
while (i > 0) {
--i;
SDL_DestroySurface(data->frames[i].surface);
}
SDL_free(data);
SDL_free(cursor);
return NULL;
}
} else {
++surface->refcount;
}
data->frames[i].surface = surface;
data->frames[i].duration = frames[i].duration;
++frames[i].surface->refcount;
}
cursor->internal = data;
return cursor;