From owner-svn-src-stable-7@FreeBSD.ORG Fri Oct 31 09:09:23 2008 Return-Path: Delivered-To: svn-src-stable-7@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5857C106568B; Fri, 31 Oct 2008 09:09:23 +0000 (UTC) (envelope-from davidxu@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 48EB58FC13; Fri, 31 Oct 2008 09:09:23 +0000 (UTC) (envelope-from davidxu@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id m9V99Mrp075023; Fri, 31 Oct 2008 09:09:22 GMT (envelope-from davidxu@svn.freebsd.org) Received: (from davidxu@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id m9V99Mdo075022; Fri, 31 Oct 2008 09:09:22 GMT (envelope-from davidxu@svn.freebsd.org) Message-Id: <200810310909.m9V99Mdo075022@svn.freebsd.org> From: David Xu Date: Fri, 31 Oct 2008 09:09:22 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r184497 - stable/7/libexec/rtld-elf X-BeenThere: svn-src-stable-7@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 7-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 31 Oct 2008 09:09:23 -0000 Author: davidxu Date: Fri Oct 31 09:09:22 2008 New Revision: 184497 URL: http://svn.freebsd.org/changeset/base/184497 Log: Merge revision 183061 from head to stable/7. > Allow multiple locks to be acquired by detecting corresponding > bit flag, otherwise if a thread acquired a lock, another thread > or the current thread itself can no longer acquire another lock > because thread_mask_set() return whole flag word, this results > bit leaking in the word and misbehavior in later locking and > unlocking. Approved by: re (kib) Modified: stable/7/libexec/rtld-elf/ (props changed) stable/7/libexec/rtld-elf/rtld_lock.c Modified: stable/7/libexec/rtld-elf/rtld_lock.c ============================================================================== --- stable/7/libexec/rtld-elf/rtld_lock.c Fri Oct 31 08:42:34 2008 (r184496) +++ stable/7/libexec/rtld-elf/rtld_lock.c Fri Oct 31 09:09:22 2008 (r184497) @@ -184,7 +184,7 @@ rtld_lock_t rtld_phdr_lock = &rtld_locks int rlock_acquire(rtld_lock_t lock) { - if (thread_mask_set(lock->mask)) { + if (thread_mask_set(lock->mask) & lock->mask) { dbg("rlock_acquire: recursed"); return (0); } @@ -195,7 +195,7 @@ rlock_acquire(rtld_lock_t lock) int wlock_acquire(rtld_lock_t lock) { - if (thread_mask_set(lock->mask)) { + if (thread_mask_set(lock->mask) & lock->mask) { dbg("wlock_acquire: recursed"); return (0); }