semaphore: fix setting EINVAL in sem_post() and sem_wait()
authorEunBong Song <eunb.song@samsung.com>
Tue, 25 Apr 2017 10:29:25 +0000 (19:29 +0900)
committerHeesub Shin <heesub.shin@samsung.com>
Sat, 6 May 2017 13:46:10 +0000 (22:46 +0900)
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 <gnutt@nuttx.org>
Signed-off-by: Paul A. Patience <paul-a.patience@polymtl.ca>
[Song: backported 891113da from NuttX]
Signed-off-by: EunBong Song <eunb.song@samsung.com>
os/kernel/semaphore/sem_post.c
os/kernel/semaphore/sem_wait.c

index 9a445c6..2a1ea5e 100644 (file)
@@ -58,6 +58,7 @@
 
 #include <limits.h>
 #include <semaphore.h>
+#include <errno.h>
 #include <sched.h>
 #include <tinyara/arch.h>
 
@@ -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;
index 0c59d6f..4684d99 100644 (file)
@@ -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();