mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-05-27 19:19:41 +08:00
thread: Use a flexible array member for "array" in SDL_TLSData.
Avoids UBSan warning (among other similar ones in SDL_thread.c):
src/thread/SDL_thread.c:109:13: runtime error: index 1 out of bounds for type 'struct (unnamed struct at src/thread/SDL_thread_c.h:70:5)[1]'
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior src/thread/SDL_thread.c:109:13
(cherry picked from commit f9395a766f)
This commit is contained in:
committed by
Sam Lantinga
parent
012443729d
commit
66a8454f2d
@@ -99,7 +99,7 @@ bool SDL_SetTLS(SDL_TLSID *id, const void *value, SDL_TLSDestructorCallback dest
|
|||||||
|
|
||||||
oldlimit = storage ? storage->limit : 0;
|
oldlimit = storage ? storage->limit : 0;
|
||||||
newlimit = (storage_index + TLS_ALLOC_CHUNKSIZE);
|
newlimit = (storage_index + TLS_ALLOC_CHUNKSIZE);
|
||||||
new_storage = (SDL_TLSData *)SDL_realloc(storage, sizeof(*storage) + (newlimit - 1) * sizeof(storage->array[0]));
|
new_storage = (SDL_TLSData *)SDL_realloc(storage, sizeof(*storage) + newlimit * sizeof(storage->array[0]));
|
||||||
if (!new_storage) {
|
if (!new_storage) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,11 +67,18 @@ extern void SDL_RunThread(SDL_Thread *thread);
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int limit;
|
int limit;
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable : 4200) // Flexible array members (C99)
|
||||||
|
#endif
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
void *data;
|
void *data;
|
||||||
void(SDLCALL *destructor)(void *);
|
void(SDLCALL *destructor)(void *);
|
||||||
} array[1];
|
} array[];
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
} SDL_TLSData;
|
} SDL_TLSData;
|
||||||
|
|
||||||
// This is how many TLS entries we allocate at once
|
// This is how many TLS entries we allocate at once
|
||||||
|
|||||||
Reference in New Issue
Block a user