From 649babfd9a60bacab6c17fdb0f831bc871d0f67d Mon Sep 17 00:00:00 2001 From: EunBong Song Date: Tue, 25 Apr 2017 19:29:25 +0900 Subject: [PATCH] semaphore: fix setting EINVAL in sem_post() and sem_wait() This patch sets errno to EINVAL when sem argument is NULL in sem_post() and sem_wait(). All credits should go to Paul A. Patience who wrote the original commit. Change-Id: If51df37aefac2f1802f14e7c293d040e4c8d593b Signed-off-by: Gregory Nutt Signed-off-by: Paul A. Patience [Song: backported 891113da from NuttX] Signed-off-by: EunBong Song --- os/kernel/semaphore/sem_post.c | 5 +++++ os/kernel/semaphore/sem_wait.c | 7 +++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/os/kernel/semaphore/sem_post.c b/os/kernel/semaphore/sem_post.c index 9a445c6..2a1ea5e 100644 --- a/os/kernel/semaphore/sem_post.c +++ b/os/kernel/semaphore/sem_post.c @@ -58,6 +58,7 @@ #include #include +#include #include #include @@ -188,6 +189,8 @@ int sem_post(FAR sem_t *sem) /* Interrupts may now be enabled. */ irqrestore(saved_state); + } else { + set_errno(EINVAL); } return ret; @@ -271,6 +274,8 @@ int sem_post_from_isr(FAR sem_t *sem) /* Interrupts may now be enabled. */ irqrestore(saved_state); + } else { + set_errno(EINVAL); } return ret; diff --git a/os/kernel/semaphore/sem_wait.c b/os/kernel/semaphore/sem_wait.c index 0c59d6f..4684d99 100644 --- a/os/kernel/semaphore/sem_wait.c +++ b/os/kernel/semaphore/sem_wait.c @@ -122,9 +122,6 @@ int sem_wait(FAR sem_t *sem) DEBUGASSERT(sem != NULL && up_interrupt_context() == false); - /* Assume any errors reported are due to invalid arguments. */ - set_errno(EINVAL); - /* The following operations must be performed with interrupts * disabled because sem_post() may be called from an interrupt * handler. @@ -143,7 +140,7 @@ int sem_wait(FAR sem_t *sem) } /* Make sure we were supplied with a valid semaphore */ - if (sem != NULL) { + if (sem != NULL) { /* Check if the lock is available */ @@ -226,6 +223,8 @@ int sem_wait(FAR sem_t *sem) sched_unlock(); #endif } + } else { + set_errno(EINVAL); } leave_cancellation_point(); -- 2.7.4