Module Name: src Committed By: joerg Date: Sun Mar 27 13:14:42 UTC 2011
Modified Files: src/libexec/ld.elf_so: rtld.c Log Message: Locking around dlclose() To generate a diff of this commit: cvs rdiff -u -r1.142 -r1.143 src/libexec/ld.elf_so/rtld.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/libexec/ld.elf_so/rtld.c diff -u src/libexec/ld.elf_so/rtld.c:1.142 src/libexec/ld.elf_so/rtld.c:1.143 --- src/libexec/ld.elf_so/rtld.c:1.142 Sat Mar 26 21:40:37 2011 +++ src/libexec/ld.elf_so/rtld.c Sun Mar 27 13:14:42 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: rtld.c,v 1.142 2011/03/26 21:40:37 joerg Exp $ */ +/* $NetBSD: rtld.c,v 1.143 2011/03/27 13:14:42 joerg Exp $ */ /* * Copyright 1996 John D. Polstra. @@ -40,7 +40,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: rtld.c,v 1.142 2011/03/26 21:40:37 joerg Exp $"); +__RCSID("$NetBSD: rtld.c,v 1.143 2011/03/27 13:14:42 joerg Exp $"); #endif /* not lint */ #include <sys/param.h> @@ -839,10 +839,17 @@ int dlclose(void *handle) { - Obj_Entry *root = _rtld_dlcheck(handle); + Obj_Entry *root; - if (root == NULL) + + _rtld_exclusive_enter(); + + root = _rtld_dlcheck(handle); + + if (root == NULL) { + _rtld_exclusive_exit(); return -1; + } _rtld_debug.r_state = RT_DELETE; _rtld_debug_state(); @@ -853,6 +860,8 @@ _rtld_debug.r_state = RT_CONSISTENT; _rtld_debug_state(); + _rtld_exclusive_enter(); + return 0; }