summaryrefslogtreecommitdiffstats
path: root/sys/kern/sysv_sem.c
diff options
context:
space:
mode:
authorgonzo <gonzo@FreeBSD.org>2008-06-19 18:08:42 +0000
committergonzo <gonzo@FreeBSD.org>2008-06-19 18:08:42 +0000
commitc5bc6314e26838a645dc67654364dc47d5e3bb98 (patch)
treeeec439d6c836832fe1d99038cca03ced7da00ae7 /sys/kern/sysv_sem.c
parent6f4770a5ef495081f958a973e64b7d55e56aa894 (diff)
downloadFreeBSD-src-c5bc6314e26838a645dc67654364dc47d5e3bb98.zip
FreeBSD-src-c5bc6314e26838a645dc67654364dc47d5e3bb98.tar.gz
Renew semaphore's pointer after wakeup since during msleep
sem_base may have been modified by destroying one of semaphores and semptr would not be valid in this case. PR: kern/123731
Diffstat (limited to 'sys/kern/sysv_sem.c')
-rw-r--r--sys/kern/sysv_sem.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/sys/kern/sysv_sem.c b/sys/kern/sysv_sem.c
index bea7832..80d07ba 100644
--- a/sys/kern/sysv_sem.c
+++ b/sys/kern/sysv_sem.c
@@ -1167,6 +1167,13 @@ semop(td, uap)
}
/*
+ * Renew the semaphore's pointer after wakeup since
+ * during msleep sem_base may have been modified and semptr
+ * is not valid any more
+ */
+ semptr = &semakptr->u.sem_base[sopptr->sem_num];
+
+ /*
* The semaphore is still alive. Readjust the count of
* waiting processes.
*/
OpenPOWER on IntegriCloud