Module Name: src Committed By: kamil Date: Fri Jan 31 17:52:15 UTC 2020
Modified Files: src/lib/libpthread: pthread_mutex.c pthread_rwlock.c pthread_spin.c Log Message: Refactor libpthread checks for invalid arguments Switch from manual functions to pthread__error(). To generate a diff of this commit: cvs rdiff -u -r1.71 -r1.72 src/lib/libpthread/pthread_mutex.c cvs rdiff -u -r1.37 -r1.38 src/lib/libpthread/pthread_rwlock.c cvs rdiff -u -r1.6 -r1.7 src/lib/libpthread/pthread_spin.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_mutex.c diff -u src/lib/libpthread/pthread_mutex.c:1.71 src/lib/libpthread/pthread_mutex.c:1.72 --- src/lib/libpthread/pthread_mutex.c:1.71 Fri Jan 31 02:37:46 2020 +++ src/lib/libpthread/pthread_mutex.c Fri Jan 31 17:52:14 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: pthread_mutex.c,v 1.71 2020/01/31 02:37:46 christos Exp $ */ +/* $NetBSD: pthread_mutex.c,v 1.72 2020/01/31 17:52:14 kamil Exp $ */ /*- * Copyright (c) 2001, 2003, 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -47,7 +47,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: pthread_mutex.c,v 1.71 2020/01/31 02:37:46 christos Exp $"); +__RCSID("$NetBSD: pthread_mutex.c,v 1.72 2020/01/31 17:52:14 kamil Exp $"); #include <sys/types.h> #include <sys/lwpctl.h> @@ -131,6 +131,9 @@ pthread_mutex_init(pthread_mutex_t *ptm, return __libc_mutex_init_stub(ptm, attr); #endif + pthread__error(EINVAL, "Invalid mutes attribute", + attr == NULL || attr->ptma_magic == _PT_MUTEXATTR_MAGIC); + if (attr == NULL) { type = PTHREAD_MUTEX_NORMAL; proto = PTHREAD_PRIO_NONE; Index: src/lib/libpthread/pthread_rwlock.c diff -u src/lib/libpthread/pthread_rwlock.c:1.37 src/lib/libpthread/pthread_rwlock.c:1.38 --- src/lib/libpthread/pthread_rwlock.c:1.37 Mon Jan 13 18:22:56 2020 +++ src/lib/libpthread/pthread_rwlock.c Fri Jan 31 17:52:14 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: pthread_rwlock.c,v 1.37 2020/01/13 18:22:56 ad Exp $ */ +/* $NetBSD: pthread_rwlock.c,v 1.38 2020/01/31 17:52:14 kamil Exp $ */ /*- * Copyright (c) 2002, 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: pthread_rwlock.c,v 1.37 2020/01/13 18:22:56 ad Exp $"); +__RCSID("$NetBSD: pthread_rwlock.c,v 1.38 2020/01/31 17:52:14 kamil Exp $"); #include <sys/types.h> #include <sys/lwpctl.h> @@ -91,8 +91,9 @@ pthread_rwlock_init(pthread_rwlock_t *pt if (__predict_false(__uselibcstub)) return __libc_rwlock_init_stub(ptr, attr); - if (attr && (attr->ptra_magic != _PT_RWLOCKATTR_MAGIC)) - return EINVAL; + pthread__error(EINVAL, "Invalid rwlock attribute", + attr == NULL || attr->ptra_magic == _PT_RWLOCKATTR_MAGIC); + ptr->ptr_magic = _PT_RWLOCK_MAGIC; PTQ_INIT(&ptr->ptr_rblocked); PTQ_INIT(&ptr->ptr_wblocked); @@ -109,8 +110,10 @@ pthread_rwlock_destroy(pthread_rwlock_t if (__predict_false(__uselibcstub)) return __libc_rwlock_destroy_stub(ptr); - if ((ptr->ptr_magic != _PT_RWLOCK_MAGIC) || - (!PTQ_EMPTY(&ptr->ptr_rblocked)) || + pthread__error(EINVAL, "Invalid rwlock", + ptr->ptr_magic == _PT_RWLOCK_MAGIC); + + if ((!PTQ_EMPTY(&ptr->ptr_rblocked)) || (!PTQ_EMPTY(&ptr->ptr_wblocked)) || (ptr->ptr_nreaders != 0) || (ptr->ptr_owner != NULL)) @@ -156,8 +159,8 @@ pthread__rwlock_rdlock(pthread_rwlock_t int error; #ifdef ERRORCHECK - if (ptr->ptr_magic != _PT_RWLOCK_MAGIC) - return EINVAL; + pthread__error(EINVAL, "Invalid rwlock", + ptr->ptr_magic == _PT_RWLOCK_MAGIC); #endif for (owner = (uintptr_t)ptr->ptr_owner;; owner = next) { @@ -246,8 +249,8 @@ pthread_rwlock_tryrdlock(pthread_rwlock_ return __libc_rwlock_tryrdlock_stub(ptr); #ifdef ERRORCHECK - if (ptr->ptr_magic != _PT_RWLOCK_MAGIC) - return EINVAL; + pthread__error(EINVAL, "Invalid rwlock", + ptr->ptr_magic == _PT_RWLOCK_MAGIC); #endif /* @@ -281,8 +284,8 @@ pthread__rwlock_wrlock(pthread_rwlock_t _DIAGASSERT(((uintptr_t)self & RW_FLAGMASK) == 0); #ifdef ERRORCHECK - if (ptr->ptr_magic != _PT_RWLOCK_MAGIC) - return EINVAL; + pthread__error(EINVAL, "Invalid rwlock", + ptr->ptr_magic == _PT_RWLOCK_MAGIC); #endif for (owner = (uintptr_t)ptr->ptr_owner;; owner = next) { @@ -372,8 +375,8 @@ pthread_rwlock_trywrlock(pthread_rwlock_ return __libc_rwlock_trywrlock_stub(ptr); #ifdef ERRORCHECK - if (ptr->ptr_magic != _PT_RWLOCK_MAGIC) - return EINVAL; + pthread__error(EINVAL, "Invalid rwlock", + ptr->ptr_magic == _PT_RWLOCK_MAGIC); #endif self = pthread__self(); @@ -451,8 +454,8 @@ pthread_rwlock_unlock(pthread_rwlock_t * return __libc_rwlock_unlock_stub(ptr); #ifdef ERRORCHECK - if ((ptr == NULL) || (ptr->ptr_magic != _PT_RWLOCK_MAGIC)) - return EINVAL; + pthread__error(EINVAL, "Invalid rwlock", + ptr->ptr_magic == _PT_RWLOCK_MAGIC); #endif #ifndef PTHREAD__ATOMIC_IS_MEMBAR @@ -650,6 +653,10 @@ int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t * __restrict attr, int * __restrict pshared) { + + pthread__error(EINVAL, "Invalid rwlock attribute", + ptr->ptra_magic == _PT_RWLOCKATTR_MAGIC); + *pshared = PTHREAD_PROCESS_PRIVATE; return 0; } @@ -658,6 +665,9 @@ int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr, int pshared) { + pthread__error(EINVAL, "Invalid rwlock attribute", + ptr->ptra_magic == _PT_RWLOCKATTR_MAGIC); + switch(pshared) { case PTHREAD_PROCESS_PRIVATE: return 0; @@ -684,9 +694,9 @@ int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr) { - if ((attr == NULL) || - (attr->ptra_magic != _PT_RWLOCKATTR_MAGIC)) - return EINVAL; + pthread__error(EINVAL, "Invalid rwlock attribute", + attr->ptra_magic == _PT_RWLOCKATTR_MAGIC); + attr->ptra_magic = _PT_RWLOCKATTR_DEAD; return 0; Index: src/lib/libpthread/pthread_spin.c diff -u src/lib/libpthread/pthread_spin.c:1.6 src/lib/libpthread/pthread_spin.c:1.7 --- src/lib/libpthread/pthread_spin.c:1.6 Thu Aug 16 04:49:47 2012 +++ src/lib/libpthread/pthread_spin.c Fri Jan 31 17:52:14 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: pthread_spin.c,v 1.6 2012/08/16 04:49:47 matt Exp $ */ +/* $NetBSD: pthread_spin.c,v 1.7 2020/01/31 17:52:14 kamil Exp $ */ /*- * Copyright (c) 2001, 2006, 2007 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: pthread_spin.c,v 1.6 2012/08/16 04:49:47 matt Exp $"); +__RCSID("$NetBSD: pthread_spin.c,v 1.7 2020/01/31 17:52:14 kamil Exp $"); #include <sys/types.h> #include <sys/ras.h> @@ -54,9 +54,9 @@ pthread_spin_init(pthread_spinlock_t *lo { #ifdef ERRORCHECK - if (lock == NULL || (pshared != PTHREAD_PROCESS_PRIVATE && - pshared != PTHREAD_PROCESS_SHARED)) - return EINVAL; + pthread__error(EINVAL, "Invalid pshared", + pshared == PTHREAD_PROCESS_PRIVATE || + pshared == PTHREAD_PROCESS_SHARED); #endif lock->pts_magic = _PT_SPINLOCK_MAGIC; @@ -76,8 +76,9 @@ pthread_spin_destroy(pthread_spinlock_t { #ifdef ERRORCHECK - if (lock == NULL || lock->pts_magic != _PT_SPINLOCK_MAGIC) - return EINVAL; + pthread__error(EINVAL, "Invalid spinlock", + lock->pts_magic == _PT_SPINLOCK_MAGIC); + if (!__SIMPLELOCK_UNLOCKED_P(&lock->pts_spin)) return EBUSY; #endif @@ -93,8 +94,8 @@ pthread_spin_lock(pthread_spinlock_t *lo pthread_t self; #ifdef ERRORCHECK - if (lock == NULL || lock->pts_magic != _PT_SPINLOCK_MAGIC) - return EINVAL; + pthread__error(EINVAL, "Invalid spinlock", + lock->pts_magic == _PT_SPINLOCK_MAGIC); #endif self = pthread__self(); @@ -111,8 +112,8 @@ pthread_spin_trylock(pthread_spinlock_t pthread_t self; #ifdef ERRORCHECK - if (lock == NULL || lock->pts_magic != _PT_SPINLOCK_MAGIC) - return EINVAL; + pthread__error(EINVAL, "Invalid spinlock", + lock->pts_magic == _PT_SPINLOCK_MAGIC); #endif self = pthread__self(); @@ -127,8 +128,8 @@ pthread_spin_unlock(pthread_spinlock_t * pthread_t self; #ifdef ERRORCHECK - if (lock == NULL || lock->pts_magic != _PT_SPINLOCK_MAGIC) - return EINVAL; + pthread__error(EINVAL, "Invalid spinlock", + lock->pts_magic == _PT_SPINLOCK_MAGIC); #endif self = pthread__self();