mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-05-06 07:54:04 +02:00
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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user