Module Name: src Committed By: matt Date: Wed Sep 12 14:55:48 UTC 2012
Modified Files: src/lib/libpthread: pthread_specific.c Log Message: Only copy the ucontext_t in pthread_setcontext if _UC_TLSBASE is set. Conditionalize the test on _UC_TLSBASE being defined. To generate a diff of this commit: cvs rdiff -u -r1.22 -r1.23 src/lib/libpthread/pthread_specific.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_specific.c diff -u src/lib/libpthread/pthread_specific.c:1.22 src/lib/libpthread/pthread_specific.c:1.23 --- src/lib/libpthread/pthread_specific.c:1.22 Wed Sep 12 02:00:53 2012 +++ src/lib/libpthread/pthread_specific.c Wed Sep 12 14:55:48 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: pthread_specific.c,v 1.22 2012/09/12 02:00:53 manu Exp $ */ +/* $NetBSD: pthread_specific.c,v 1.23 2012/09/12 14:55:48 matt Exp $ */ /*- * Copyright (c) 2001, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: pthread_specific.c,v 1.22 2012/09/12 02:00:53 manu Exp $"); +__RCSID("$NetBSD: pthread_specific.c,v 1.23 2012/09/12 14:55:48 matt Exp $"); /* Functions and structures dealing with thread-specific data */ @@ -89,9 +89,16 @@ pthread_curcpu_np(void) int pthread_setcontext(const ucontext_t *ucp) { +#ifdef _UC_TLSBASE ucontext_t uc; - - (void)memcpy(&uc, ucp, sizeof(uc)); - uc.uc_flags &= ~_UC_TLSBASE; - return _sys_setcontext(&uc); + /* + * Only copy and clear _UC_TLSBASE if it is set. + */ + if (ucp->uc_flags & _UC_TLSBASE) { + uc = *ucp; + uc.uc_flags &= ~_UC_TLSBASE; + ucp = &uc; + } +#endif /* _UC_TLSBASE */ + return _sys_setcontext(ucp); }