mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-06-06 06:34:35 +00: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.
(cherry picked from commit f6f4664ed1)
This commit is contained in:
parent
6d35168a63
commit
05d8af1a75
1 changed files with 16 additions and 2 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue