1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 20:07:36 +00:00

LibPthread: Ensure we're not overflowing the semaphore's value

This commit is contained in:
Gunnar Beutner 2021-04-14 22:45:21 +02:00 committed by Andreas Kling
parent 62ced35346
commit 98403eccb0
2 changed files with 18 additions and 2 deletions

View file

@ -48,8 +48,15 @@ int sem_getvalue(sem_t*, int*)
int sem_init(sem_t* sem, int shared, unsigned int value) int sem_init(sem_t* sem, int shared, unsigned int value)
{ {
if (shared) if (shared) {
return ENOSYS; errno = ENOSYS;
return -1;
}
if (value > SEM_VALUE_MAX) {
errno = EINVAL;
return -1;
}
if (pthread_mutex_init(&sem->mtx, nullptr) != 0) if (pthread_mutex_init(&sem->mtx, nullptr) != 0)
return -1; return -1;
@ -70,6 +77,12 @@ sem_t* sem_open(const char*, int, ...)
int sem_post(sem_t* sem) int sem_post(sem_t* sem)
{ {
if (sem->value == SEM_VALUE_MAX) {
pthread_mutex_unlock(&sem->mtx);
errno = EOVERFLOW;
return -1;
}
sem->value++; sem->value++;
pthread_cond_signal(&sem->cv); pthread_cond_signal(&sem->cv);

View file

@ -26,6 +26,7 @@
#pragma once #pragma once
#include <limits.h>
#include <pthread.h> #include <pthread.h>
#include <sys/cdefs.h> #include <sys/cdefs.h>
#include <sys/types.h> #include <sys/types.h>
@ -48,4 +49,6 @@ int sem_trywait(sem_t*);
int sem_unlink(const char*); int sem_unlink(const char*);
int sem_wait(sem_t*); int sem_wait(sem_t*);
#define SEM_VALUE_MAX INT_MAX
__END_DECLS __END_DECLS