Browse Source

Make sure we don't allocate a TLS ID clobbering an application defined one

Fixes https://github.com/libsdl-org/SDL/issues/14359
Sam Lantinga 1 month ago
parent
commit
d9ca0457b5
1 changed files with 9 additions and 0 deletions
  1. 9 0
      src/thread/SDL_thread.c

+ 9 - 0
src/thread/SDL_thread.c

@@ -80,6 +80,15 @@ bool SDL_SetTLS(SDL_TLSID *id, const void *value, SDL_TLSDestructorCallback dest
          * will have the same storage index for this id.
          */
         storage_index = SDL_GetAtomicInt(id) - 1;
+    } else {
+        // Make sure we don't allocate an ID clobbering this one
+        int tls_id = SDL_GetAtomicInt(&SDL_tls_id);
+        while (storage_index >= tls_id) {
+            if (SDL_CompareAndSwapAtomicInt(&SDL_tls_id, tls_id, storage_index + 1)) {
+                break;
+            }
+            tls_id = SDL_GetAtomicInt(&SDL_tls_id);
+        }
     }
 
     // Get the storage for the current thread