Repair the out-of-bounds error of the semaphore.

This commit is contained in:
Flower Black 2024-12-04 12:20:01 +08:00 committed by SJTUqizhenlin
parent 5f47b92255
commit 3ef1f5570c
1 changed files with 22 additions and 17 deletions

View File

@ -41,15 +41,28 @@ int IPC_DO_SERVE_FUNC(Ipc_sem_create)(sem_t* sem, int* count)
return SEMAPHORE_SUC; return SEMAPHORE_SUC;
} }
#define CHECK_SEM_RANGE(sem) \
do { \
if (*sem < 0 || *sem >= MAX_SUPPORT_SEMAPHORES) { \
return SEMAPHORE_ERR; \
} \
} while (0)
#define CHECK_SEM_RANGE_AND_VALID(sem) \
do { \
CHECK_SEM_RANGE(sem); \
\
if (!sem_pool[*sem].valid) { \
return SEMAPHORE_ERR; \
} \
} while (0)
int IPC_DO_SERVE_FUNC(Ipc_sem_delete)(sem_t* sem) int IPC_DO_SERVE_FUNC(Ipc_sem_delete)(sem_t* sem)
{ {
if (*sem < 0 || *sem > MAX_SUPPORT_SEMAPHORES) { CHECK_SEM_RANGE_AND_VALID(sem);
return SEMAPHORE_ERR;
}
if (!sem_pool[*sem].valid) {
return SEMAPHORE_ERR;
}
sem_pool[*sem].valid = false; sem_pool[*sem].valid = false;
return SEMAPHORE_SUC; return SEMAPHORE_SUC;
@ -57,9 +70,7 @@ int IPC_DO_SERVE_FUNC(Ipc_sem_delete)(sem_t* sem)
int IPC_DO_SERVE_FUNC(Ipc_sem_wait)(sem_t* sem, int* timeout) int IPC_DO_SERVE_FUNC(Ipc_sem_wait)(sem_t* sem, int* timeout)
{ {
if (*sem < 0 || *sem > MAX_SUPPORT_SEMAPHORES) { CHECK_SEM_RANGE(sem);
return SEMAPHORE_ERR;
}
/// @todo support timeout /// @todo support timeout
// return if sem is freed(no valid) or sem count is sufficient // return if sem is freed(no valid) or sem count is sufficient
@ -72,13 +83,7 @@ int IPC_DO_SERVE_FUNC(Ipc_sem_wait)(sem_t* sem, int* timeout)
int IPC_DO_SERVE_FUNC(Ipc_sem_signal)(sem_t* sem) int IPC_DO_SERVE_FUNC(Ipc_sem_signal)(sem_t* sem)
{ {
if (*sem < 0 || *sem >= MAX_SUPPORT_SEMAPHORES) { CHECK_SEM_RANGE_AND_VALID(sem);
return SEMAPHORE_ERR;
}
if (!sem_pool[*sem].valid) {
return SEMAPHORE_ERR;
}
sem_pool[*sem].count++; sem_pool[*sem].count++;
return SEMAPHORE_SUC; return SEMAPHORE_SUC;