From 5a2a1d75043138e696222ced4560de2fb90b8024 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Mon, 3 May 2010 08:08:28 -0700 Subject: Don't deadlock in __dl_iterate_phdr while (un)loading objects. --- elf/dl-iteratephdr.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'elf/dl-iteratephdr.c') diff --git a/elf/dl-iteratephdr.c b/elf/dl-iteratephdr.c index 44864c1b7a..5f1c20d755 100644 --- a/elf/dl-iteratephdr.c +++ b/elf/dl-iteratephdr.c @@ -26,7 +26,7 @@ static void cancel_handler (void *arg __attribute__((unused))) { - __rtld_lock_unlock_recursive (GL(dl_load_lock)); + __rtld_lock_unlock_recursive (GL(dl_load_write_lock)); } hidden_proto (__dl_iterate_phdr) @@ -38,8 +38,8 @@ __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info, struct dl_phdr_info info; int ret = 0; - /* Make sure we are alone. */ - __rtld_lock_lock_recursive (GL(dl_load_lock)); + /* Make sure nobody modifies the list of loaded objects. */ + __rtld_lock_lock_recursive (GL(dl_load_write_lock)); __libc_cleanup_push (cancel_handler, 0); /* We have to determine the namespace of the caller since this determines @@ -79,7 +79,7 @@ __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info, /* Release the lock. */ __libc_cleanup_pop (0); - __rtld_lock_unlock_recursive (GL(dl_load_lock)); + __rtld_lock_unlock_recursive (GL(dl_load_write_lock)); return ret; } -- cgit v1.2.3