Module Name: src Committed By: kamil Date: Wed Jan 29 15:07:46 UTC 2020
Modified Files: src/lib/libpthread: pthread_cond.c Log Message: Use pthread_condattr_t and pthread_cond_t magic fields Validate _PT_CONDATTR_MAGIC and _PT_COND_MAGIC respectively. To generate a diff of this commit: cvs rdiff -u -r1.66 -r1.67 src/lib/libpthread/pthread_cond.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libpthread/pthread_cond.c diff -u src/lib/libpthread/pthread_cond.c:1.66 src/lib/libpthread/pthread_cond.c:1.67 --- src/lib/libpthread/pthread_cond.c:1.66 Mon Jan 13 18:22:56 2020 +++ src/lib/libpthread/pthread_cond.c Wed Jan 29 15:07:46 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: pthread_cond.c,v 1.66 2020/01/13 18:22:56 ad Exp $ */ +/* $NetBSD: pthread_cond.c,v 1.67 2020/01/29 15:07:46 kamil Exp $ */ /*- * Copyright (c) 2001, 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -46,7 +46,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: pthread_cond.c,v 1.66 2020/01/13 18:22:56 ad Exp $"); +__RCSID("$NetBSD: pthread_cond.c,v 1.67 2020/01/29 15:07:46 kamil Exp $"); #include <stdlib.h> #include <errno.h> @@ -78,6 +78,10 @@ __strong_alias(__libc_cond_destroy,pthre static clockid_t pthread_cond_getclock(const pthread_cond_t *cond) { + + pthread__error(EINVAL, "Invalid condition variable", + cond->ptc_magic == _PT_COND_MAGIC); + return cond->ptc_private ? *(clockid_t *)cond->ptc_private : CLOCK_REALTIME; } @@ -222,9 +226,6 @@ pthread__cond_wake_one(pthread_cond_t *c pthread_mutex_t *mutex; lwpid_t lid; - pthread__error(EINVAL, "Invalid condition variable", - cond->ptc_magic == _PT_COND_MAGIC); - /* * Pull the first thread off the queue. If the current thread * is associated with the condition variable, remove it without @@ -278,6 +279,9 @@ pthread_cond_signal(pthread_cond_t *cond if (__predict_false(__uselibcstub)) return __libc_cond_signal_stub(cond); + pthread__error(EINVAL, "Invalid condition variable", + cond->ptc_magic == _PT_COND_MAGIC); + if (__predict_true(PTQ_EMPTY(&cond->ptc_waiters))) return 0; return pthread__cond_wake_one(cond); @@ -291,9 +295,6 @@ pthread__cond_wake_all(pthread_cond_t *c u_int max; size_t nwaiters; - pthread__error(EINVAL, "Invalid condition variable", - cond->ptc_magic == _PT_COND_MAGIC); - /* * Try to defer waking threads (see pthread_cond_signal()). * Only transfer waiters for which there is no pending wakeup. @@ -328,6 +329,9 @@ pthread_cond_broadcast(pthread_cond_t *c if (__predict_false(__uselibcstub)) return __libc_cond_broadcast_stub(cond); + pthread__error(EINVAL, "Invalid condition variable", + cond->ptc_magic == _PT_COND_MAGIC); + if (__predict_true(PTQ_EMPTY(&cond->ptc_waiters))) return 0; return pthread__cond_wake_all(cond); @@ -353,6 +357,10 @@ pthread_condattr_init(pthread_condattr_t int pthread_condattr_setclock(pthread_condattr_t *attr, clockid_t clck) { + + pthread__error(EINVAL, "Invalid condition variable attribute", + attr->ptca_magic == _PT_CONDATTR_MAGIC); + switch (clck) { case CLOCK_MONOTONIC: case CLOCK_REALTIME: @@ -371,6 +379,10 @@ int pthread_condattr_getclock(const pthread_condattr_t *__restrict attr, clockid_t *__restrict clock_id) { + + pthread__error(EINVAL, "Invalid condition variable attribute", + attr->ptca_magic == _PT_CONDATTR_MAGIC); + if (attr == NULL || attr->ptca_private == NULL) return EINVAL; *clock_id = *(clockid_t *)attr->ptca_private; @@ -396,6 +408,9 @@ pthread_condattr_getpshared(const pthrea int * __restrict pshared) { + pthread__error(EINVAL, "Invalid condition variable attribute", + attr->ptca_magic == _PT_CONDATTR_MAGIC); + *pshared = PTHREAD_PROCESS_PRIVATE; return 0; } @@ -404,6 +419,9 @@ int pthread_condattr_setpshared(pthread_condattr_t *attr, int pshared) { + pthread__error(EINVAL, "Invalid condition variable attribute", + attr->ptca_magic == _PT_CONDATTR_MAGIC); + switch(pshared) { case PTHREAD_PROCESS_PRIVATE: return 0;