From 3da0b89ac6c68a1d88499832250b21865ba546f8 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 7 May 2026 17:06:05 -0700 Subject: [PATCH] null check semaphore otherwise sem_* crashes --- src/linux/base/linux_base.c | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index 1693aeb5..01abe524 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -662,36 +662,33 @@ semaphore_open(String8 name) internal void semaphore_close(Semaphore semaphore) { - sem_t *s = (sem_t *)semaphore.u64[0]; - sem_close(s); + if(semaphore.u64[0] != 0) + { + sem_t *s = (sem_t *)semaphore.u64[0]; + sem_close(s); + } } internal B32 semaphore_take(Semaphore semaphore, U64 endt_us) { - struct timespec t = { .tv_sec = endt_us / 1000000, .tv_nsec = (endt_us % 1000000) * 1000 }; - int err = OS_LNX_RETRY_ON_EINTR(sem_clockwait((sem_t*)semaphore.u64[0], CLOCK_MONOTONIC, &t)); + int err = -1; + if(semaphore.u64[0] != 0) + { + struct timespec t = { .tv_sec = endt_us / 1000000, .tv_nsec = (endt_us % 1000000) * 1000 }; + err = OS_LNX_RETRY_ON_EINTR(sem_clockwait((sem_t*)semaphore.u64[0], CLOCK_MONOTONIC, &t)); + } return err == 0; } internal void semaphore_drop(Semaphore semaphore) { - for(;;) + int err = -1; + if(semaphore.u64[0] != 0) { - int err = sem_post((sem_t*)semaphore.u64[0]); - if(err == 0) - { - break; - } - else - { - if(errno == EAGAIN) - { - continue; - } - } - break; + err = OS_LNX_RETRY_ON_EINTR(sem_post((sem_t*)semaphore.u64[0])); + Assert(err == 0); } }