summary refs log tree commit diff
path: root/dlfcn/dlvsym.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-02-21 01:06:02 +0000
committerUlrich Drepper <drepper@redhat.com>2004-02-21 01:06:02 +0000
commita461b14777bc56a19d3252d7fa5b47ee598757a0 (patch)
treecd4ec84558ed8db4b6a0af36d57f56328ee686ce /dlfcn/dlvsym.c
parent5990e1fe120708a10ae8ab0caf4a284b5d6b10f8 (diff)
downloadglibc-a461b14777bc56a19d3252d7fa5b47ee598757a0.tar.gz
glibc-a461b14777bc56a19d3252d7fa5b47ee598757a0.tar.xz
glibc-a461b14777bc56a19d3252d7fa5b47ee598757a0.zip
Update.
2004-02-20  Ulrich Drepper  <drepper@redhat.com>

	* dlfcn/dlsym.c: Get ld.so loading lock before the call into ld.so.
	* dlfcn/dlvsym.c: Likewise.
	* elf/dl-addr.c: Get loading lock while using _dl_loaded data.
	* elf/dl-fini.c: Likewise.
	Patch by Shunichi Sagawa <s-sagawa@jp.fujitsu.com>.
Diffstat (limited to 'dlfcn/dlvsym.c')
-rw-r--r--dlfcn/dlvsym.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/dlfcn/dlvsym.c b/dlfcn/dlvsym.c
index 62415feaac..24868456e9 100644
--- a/dlfcn/dlvsym.c
+++ b/dlfcn/dlvsym.c
@@ -1,5 +1,5 @@
 /* Look up a versioned symbol in a shared object loaded by `dlopen'.
-   Copyright (C) 1995, 96, 97, 98, 99, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1995-2000, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -20,6 +20,8 @@
 #include <dlfcn.h>
 #include <stddef.h>
 
+#include <ldsodefs.h>
+
 struct dlvsym_args
 {
   /* The arguments to dlvsym_doit.  */
@@ -51,6 +53,13 @@ __dlvsym (void *handle, const char *name, const char *version_str)
   args.who = RETURN_ADDRESS (0);
   args.version = version_str;
 
-  return (_dlerror_run (dlvsym_doit, &args) ? NULL : args.sym);
+  /* Protect against concurrent loads and unloads.  */
+  __rtld_lock_lock_recursive (GL(dl_load_lock));
+
+  void *result = (_dlerror_run (dlvsym_doit, &args) ? NULL : args.sym);
+
+  __rtld_lock_unlock_recursive (GL(dl_load_lock));
+
+  return result;
 }
 weak_alias (__dlvsym, dlvsym)