From ee55de4929e149035712f805baeb391e121615a4 Mon Sep 17 00:00:00 2001
From: Joakim Tjernlund <joakim.tjernlund@transmode.se>
Date: Thu, 26 Aug 2004 14:00:04 +0000
Subject: Added test for RTLD_GLOBAL flag in _dl_find_hash(). Fixed a bug in
 libdl.c where the RTLD_GLOBAL was assigned wronly.

---
 ldso/ldso/dl-hash.c | 2 ++
 ldso/libdl/libdl.c  | 5 +++--
 2 files changed, 5 insertions(+), 2 deletions(-)

(limited to 'ldso')

diff --git a/ldso/ldso/dl-hash.c b/ldso/ldso/dl-hash.c
index 109ee0e76..bac4a506a 100644
--- a/ldso/ldso/dl-hash.c
+++ b/ldso/ldso/dl-hash.c
@@ -173,6 +173,8 @@ char *_dl_find_hash(const char *name, struct dyn_elf *rpnt, int type_class)
 	for (; rpnt; rpnt = rpnt->next) {
 		tpnt = rpnt->dyn;
 
+		if (!(tpnt->rtld_flags & RTLD_GLOBAL))
+			continue;
 		/* Don't search the executable when resolving a copy reloc. */
 		if ((type_class &  ELF_RTYPE_CLASS_COPY) && tpnt->libtype == elf_executable)
 			continue;
diff --git a/ldso/libdl/libdl.c b/ldso/libdl/libdl.c
index 6c4e9843b..8199a7598 100644
--- a/ldso/libdl/libdl.c
+++ b/ldso/libdl/libdl.c
@@ -223,13 +223,14 @@ void *dlopen(const char *libname, int flag)
 				_dl_memset (dyn_ptr->next, 0, sizeof (struct dyn_elf));
 				dyn_ptr = dyn_ptr->next;
 				dyn_ptr->dyn = tpnt1;
-				tpnt->rtld_flags |= RTLD_GLOBAL;
 				if (!tpnt1) {
 					tpnt1 = _dl_load_shared_library(0, &rpnt, tcurr, lpntstr, 0);
+					dyn_ptr->dyn = tpnt1;
 					if (!tpnt1)
 						goto oops;
-					dyn_ptr->dyn = tpnt1;
+					tpnt1->rtld_flags |= RTLD_GLOBAL;
 				} else {
+					tpnt1->rtld_flags |= RTLD_GLOBAL;
 					tpnt1->usage_count++;
 				}
 			}
-- 
cgit v1.2.3