summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJoel Linn <jl@conductive.de>2020-12-23 13:36:23 -0800
committerJoel Linn <jl@conductive.de>2020-12-23 13:36:23 -0800
commit6ed65e6a34bc693d6ad1e5e3324cc048c7718501 (patch)
tree807fa73b6fa58eba43f8ce1c33d42161077f3ba5 /test
parentdd47f541d0eeb61d22c18ba96a9a39946c4a6f60 (diff)
downloadsdl-6ed65e6a34bc693d6ad1e5e3324cc048c7718501.tar.gz
Atomic test: Fix use after free
SDL_SemPost() was called by the FIFO threads after the semaphore was freed because the main thread actually synchronized on the `writerRunning`/`readersRunning` count and not the semaphores itself.
Diffstat (limited to 'test')
-rw-r--r--test/testatomic.c10
1 files changed, 2 insertions, 8 deletions
diff --git a/test/testatomic.c b/test/testatomic.c
index e53b3177f..3099af062 100644
--- a/test/testatomic.c
+++ b/test/testatomic.c
@@ -473,8 +473,6 @@ static SDL_bool DequeueEvent_Mutex(SDL_EventQueue *queue, SDL_Event *event)
static SDL_sem *writersDone;
static SDL_sem *readersDone;
-static SDL_atomic_t writersRunning;
-static SDL_atomic_t readersRunning;
typedef struct
{
@@ -525,7 +523,6 @@ static int SDLCALL FIFO_Writer(void* _data)
}
}
}
- SDL_AtomicAdd(&writersRunning, -1);
SDL_SemPost(writersDone);
return 0;
}
@@ -563,7 +560,6 @@ static int SDLCALL FIFO_Reader(void* _data)
}
}
}
- SDL_AtomicAdd(&readersRunning, -1);
SDL_SemPost(readersDone);
return 0;
}
@@ -627,7 +623,6 @@ static void RunFIFOTest(SDL_bool lock_free)
/* Start the readers first */
SDL_Log("Starting %d readers\n", NUM_READERS);
SDL_zeroa(readerData);
- SDL_AtomicSet(&readersRunning, NUM_READERS);
for (i = 0; i < NUM_READERS; ++i) {
char name[64];
SDL_snprintf(name, sizeof (name), "FIFOReader%d", i);
@@ -639,7 +634,6 @@ static void RunFIFOTest(SDL_bool lock_free)
/* Start up the writers */
SDL_Log("Starting %d writers\n", NUM_WRITERS);
SDL_zeroa(writerData);
- SDL_AtomicSet(&writersRunning, NUM_WRITERS);
for (i = 0; i < NUM_WRITERS; ++i) {
char name[64];
SDL_snprintf(name, sizeof (name), "FIFOWriter%d", i);
@@ -650,7 +644,7 @@ static void RunFIFOTest(SDL_bool lock_free)
}
/* Wait for the writers */
- while (SDL_AtomicGet(&writersRunning) > 0) {
+ for (i = 0; i < NUM_WRITERS; ++i) {
SDL_SemWait(writersDone);
}
@@ -658,7 +652,7 @@ static void RunFIFOTest(SDL_bool lock_free)
SDL_AtomicSet(&queue.active, 0);
/* Wait for the readers */
- while (SDL_AtomicGet(&readersRunning) > 0) {
+ for (i = 0; i < NUM_READERS; ++i) {
SDL_SemWait(readersDone);
}