Module Name: src Committed By: joerg Date: Tue Jun 2 00:29:53 UTC 2020
Modified Files: src/lib/libpthread: pthread.c pthread_int.h pthread_rwlock.c Log Message: Pass down errno when calling pthread__errorfunc after a system call. Allow format arguments for that reason and use (v)snprintf_ss in pthread_errorfunc to avoid race conditions and the like. To generate a diff of this commit: cvs rdiff -u -r1.171 -r1.172 src/lib/libpthread/pthread.c cvs rdiff -u -r1.105 -r1.106 src/lib/libpthread/pthread_int.h cvs rdiff -u -r1.41 -r1.42 src/lib/libpthread/pthread_rwlock.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.171 src/lib/libpthread/pthread.c:1.172 --- src/lib/libpthread/pthread.c:1.171 Mon Jun 1 11:44:59 2020 +++ src/lib/libpthread/pthread.c Tue Jun 2 00:29:53 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: pthread.c,v 1.171 2020/06/01 11:44:59 ad Exp $ */ +/* $NetBSD: pthread.c,v 1.172 2020/06/02 00:29:53 joerg Exp $ */ /*- * Copyright (c) 2001, 2002, 2003, 2006, 2007, 2008, 2020 @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: pthread.c,v 1.171 2020/06/01 11:44:59 ad Exp $"); +__RCSID("$NetBSD: pthread.c,v 1.172 2020/06/02 00:29:53 joerg Exp $"); #define __EXPOSE_STACK 1 @@ -622,7 +622,7 @@ pthread__clear_waiters(pthread_t self) self->pt_nwaiters = 0; if (rv != 0) { pthread__errorfunc(__FILE__, __LINE__, __func__, - "_lwp_unpark failed"); + "_lwp_unpark failed: %d", errno); } break; default: @@ -631,7 +631,7 @@ pthread__clear_waiters(pthread_t self) self->pt_nwaiters = 0; if (rv != 0) { pthread__errorfunc(__FILE__, __LINE__, __func__, - "_lwp_unpark_all failed"); + "_lwp_unpark_all failed: %d", errno); } break; } @@ -1102,23 +1102,29 @@ pthread__assertfunc(const char *file, in void pthread__errorfunc(const char *file, int line, const char *function, - const char *msg) + const char *msg, ...) { char buf[1024]; + char buf2[1024]; size_t len; + va_list ap; if (pthread__diagassert == 0) return; + va_start(ap, msg); + vsnprintf_ss(buf2, sizeof(buf2), msg, ap); + va_end(ap); + /* * snprintf should not acquire any locks, or we could * end up deadlocked if the assert caller held locks. */ - len = snprintf(buf, 1024, + len = snprintf_ss(buf, sizeof(buf), "%s: Error detected by libpthread: %s.\n" "Detected by file \"%s\", line %d%s%s%s.\n" "See pthread(3) for information.\n", - getprogname(), msg, file, line, + getprogname(), buf2, file, line, function ? ", function \"" : "", function ? function : "", function ? "\"" : ""); @@ -1195,7 +1201,7 @@ pthread__park(pthread_t self, pthread_mu break; default: pthread__errorfunc(__FILE__, __LINE__, - __func__, "_lwp_park failed"); + __func__, "_lwp_park failed: %d", errno); break; } } Index: src/lib/libpthread/pthread_int.h diff -u src/lib/libpthread/pthread_int.h:1.105 src/lib/libpthread/pthread_int.h:1.106 --- src/lib/libpthread/pthread_int.h:1.105 Mon Jun 1 11:44:59 2020 +++ src/lib/libpthread/pthread_int.h Tue Jun 2 00:29:53 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: pthread_int.h,v 1.105 2020/06/01 11:44:59 ad Exp $ */ +/* $NetBSD: pthread_int.h,v 1.106 2020/06/02 00:29:53 joerg Exp $ */ /*- * Copyright (c) 2001, 2002, 2003, 2006, 2007, 2008, 2020 @@ -300,8 +300,8 @@ void pthread__copy_tsd(pthread_t) PTHREA __dead void pthread__assertfunc(const char *, int, const char *, const char *) PTHREAD_HIDE; -void pthread__errorfunc(const char *, int, const char *, const char *) - PTHREAD_HIDE; +void pthread__errorfunc(const char *, int, const char *, const char *, ...) + __printflike(4, 5) PTHREAD_HIDE; char *pthread__getenv(const char *) PTHREAD_HIDE; __dead void pthread__cancelled(void) PTHREAD_HIDE; void pthread__mutex_deferwake(pthread_t, pthread_mutex_t *) PTHREAD_HIDE; Index: src/lib/libpthread/pthread_rwlock.c diff -u src/lib/libpthread/pthread_rwlock.c:1.41 src/lib/libpthread/pthread_rwlock.c:1.42 --- src/lib/libpthread/pthread_rwlock.c:1.41 Mon Jun 1 11:44:59 2020 +++ src/lib/libpthread/pthread_rwlock.c Tue Jun 2 00:29:53 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: pthread_rwlock.c,v 1.41 2020/06/01 11:44:59 ad Exp $ */ +/* $NetBSD: pthread_rwlock.c,v 1.42 2020/06/02 00:29:53 joerg Exp $ */ /*- * Copyright (c) 2002, 2006, 2007, 2008, 2020 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: pthread_rwlock.c,v 1.41 2020/06/01 11:44:59 ad Exp $"); +__RCSID("$NetBSD: pthread_rwlock.c,v 1.42 2020/06/02 00:29:53 joerg Exp $"); #include <sys/types.h> #include <sys/lwpctl.h> @@ -361,7 +361,7 @@ pthread__rwlock_wrlock(pthread_rwlock_t return error; pthread__errorfunc(__FILE__, __LINE__, __func__, - "direct handoff failure"); + "direct handoff failure: %d", errno); } }