Module Name: src
Committed By: kamil
Date: Wed Jan 29 16:03:44 UTC 2020
Modified Files:
src/lib/libpthread: pthread.c pthread_getcpuclockid.c
Log Message:
Chack thread->pt_magic with PT_MAGIC promptly
Rearrange some checks to avoid verifying pthread_t after using it.
To generate a diff of this commit:
cvs rdiff -u -r1.160 -r1.161 src/lib/libpthread/pthread.c
cvs rdiff -u -r1.2 -r1.3 src/lib/libpthread/pthread_getcpuclockid.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.c
diff -u src/lib/libpthread/pthread.c:1.160 src/lib/libpthread/pthread.c:1.161
--- src/lib/libpthread/pthread.c:1.160 Wed Jan 29 15:31:14 2020
+++ src/lib/libpthread/pthread.c Wed Jan 29 16:03:44 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: pthread.c,v 1.160 2020/01/29 15:31:14 kamil Exp $ */
+/* $NetBSD: pthread.c,v 1.161 2020/01/29 16:03:44 kamil Exp $ */
/*-
* Copyright (c) 2001, 2002, 2003, 2006, 2007, 2008, 2020
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: pthread.c,v 1.160 2020/01/29 15:31:14 kamil Exp $");
+__RCSID("$NetBSD: pthread.c,v 1.161 2020/01/29 16:03:44 kamil Exp $");
#define __EXPOSE_STACK 1
@@ -597,6 +597,9 @@ pthread_suspend_np(pthread_t thread)
{
pthread_t self;
+ pthread__error(EINVAL, "Invalid thread",
+ thread->pt_magic == PT_MAGIC);
+
self = pthread__self();
if (self == thread) {
return EDEADLK;
@@ -611,6 +614,9 @@ pthread_suspend_np(pthread_t thread)
int
pthread_resume_np(pthread_t thread)
{
+
+ pthread__error(EINVAL, "Invalid thread",
+ thread->pt_magic == PT_MAGIC);
if (pthread__find(thread) != 0)
return ESRCH;
@@ -702,14 +708,14 @@ pthread_join(pthread_t thread, void **va
{
pthread_t self;
+ pthread__error(EINVAL, "Invalid thread",
+ thread->pt_magic == PT_MAGIC);
+
self = pthread__self();
if (pthread__find(thread) != 0)
return ESRCH;
- if (thread->pt_magic != PT_MAGIC)
- return EINVAL;
-
if (thread == self)
return EDEADLK;
@@ -764,9 +770,16 @@ pthread__reap(pthread_t thread)
int
pthread_equal(pthread_t t1, pthread_t t2)
{
+
if (__predict_false(__uselibcstub))
return __libc_thr_equal_stub(t1, t2);
+ pthread__error(EINVAL, "Invalid thread",
+ t1->pt_magic == PT_MAGIC);
+
+ pthread__error(EINVAL, "Invalid thread",
+ t2->pt_magic == PT_MAGIC);
+
/* Nothing special here. */
return (t1 == t2);
}
@@ -777,12 +790,12 @@ pthread_detach(pthread_t thread)
{
int error;
+ pthread__error(EINVAL, "Invalid thread",
+ thread->pt_magic == PT_MAGIC);
+
if (pthread__find(thread) != 0)
return ESRCH;
- if (thread->pt_magic != PT_MAGIC)
- return EINVAL;
-
pthread_mutex_lock(&thread->pt_lock);
if ((thread->pt_flags & PT_FLAG_DETACHED) != 0) {
error = EINVAL;
@@ -806,12 +819,12 @@ int
pthread_getname_np(pthread_t thread, char *name, size_t len)
{
+ pthread__error(EINVAL, "Invalid thread",
+ thread->pt_magic == PT_MAGIC);
+
if (pthread__find(thread) != 0)
return ESRCH;
- if (thread->pt_magic != PT_MAGIC)
- return EINVAL;
-
pthread_mutex_lock(&thread->pt_lock);
if (thread->pt_name == NULL)
name[0] = '\0';
@@ -829,12 +842,12 @@ pthread_setname_np(pthread_t thread, con
char *oldname, *cp, newname[PTHREAD_MAX_NAMELEN_NP];
int namelen;
+ pthread__error(EINVAL, "Invalid thread",
+ thread->pt_magic == PT_MAGIC);
+
if (pthread__find(thread) != 0)
return ESRCH;
- if (thread->pt_magic != PT_MAGIC)
- return EINVAL;
-
namelen = snprintf(newname, sizeof(newname), name, arg);
if (namelen >= PTHREAD_MAX_NAMELEN_NP)
return EINVAL;
@@ -870,6 +883,9 @@ int
pthread_cancel(pthread_t thread)
{
+ pthread__error(EINVAL, "Invalid thread",
+ thread->pt_magic == PT_MAGIC);
+
if (pthread__find(thread) != 0)
return ESRCH;
pthread_mutex_lock(&thread->pt_lock);
Index: src/lib/libpthread/pthread_getcpuclockid.c
diff -u src/lib/libpthread/pthread_getcpuclockid.c:1.2 src/lib/libpthread/pthread_getcpuclockid.c:1.3
--- src/lib/libpthread/pthread_getcpuclockid.c:1.2 Sat Mar 4 11:16:33 2017
+++ src/lib/libpthread/pthread_getcpuclockid.c Wed Jan 29 16:03:44 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: pthread_getcpuclockid.c,v 1.2 2017/03/04 11:16:33 njoly Exp $ */
+/* $NetBSD: pthread_getcpuclockid.c,v 1.3 2020/01/29 16:03:44 kamil Exp $ */
/*-
* Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: pthread_getcpuclockid.c,v 1.2 2017/03/04 11:16:33 njoly Exp $");
+__RCSID("$NetBSD: pthread_getcpuclockid.c,v 1.3 2020/01/29 16:03:44 kamil Exp $");
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
@@ -45,6 +45,9 @@ pthread_getcpuclockid(pthread_t thread,
{
int error = 0, saved_errno;
+ pthread__error(EINVAL, "Invalid thread",
+ thread->pt_magic == PT_MAGIC);
+
saved_errno = errno;
if (clock_getcpuclockid2(P_LWPID, (id_t)thread->pt_lid, clock_id) == -1)
error = errno;