From f8b23fd8da1d342dfd4f5e67377d7c0f08eb3603 Mon Sep 17 00:00:00 2001
From: Joakim Tjernlund <joakim.tjernlund@transmode.se>
Date: Thu, 14 Oct 2004 09:24:43 +0000
Subject: Don't SEGV if library not found.

---
 ldso/libdl/libdl.c | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)

(limited to 'ldso/libdl')

diff --git a/ldso/libdl/libdl.c b/ldso/libdl/libdl.c
index aa19e81cc..b08254a49 100644
--- a/ldso/libdl/libdl.c
+++ b/ldso/libdl/libdl.c
@@ -216,20 +216,19 @@ void *dlopen(const char *libname, int flag)
 					fprintf(stderr, "Trying to load '%s', needed by '%s'\n",
 							lpntstr, tcurr->libname);
 #endif
-				dyn_ptr->next = (struct dyn_elf *) malloc(sizeof(struct dyn_elf));
-				_dl_memset (dyn_ptr->next, 0, sizeof (struct dyn_elf));
-				dyn_ptr = dyn_ptr->next;
-				dyn_ptr->dyn = tpnt1;
-				if (!tpnt1) {
+				if (tpnt1) {
+					tpnt1->usage_count++;
+				} else {
 					tpnt1 = _dl_load_shared_library(0, &rpnt, tcurr, lpntstr, 0);
-					dyn_ptr->dyn = tpnt1;
 					if (!tpnt1)
 						goto oops;
-					tpnt1->rtld_flags |= RTLD_GLOBAL;
-				} else {
-					tpnt1->rtld_flags |= RTLD_GLOBAL;
-					tpnt1->usage_count++;
 				}
+				tpnt1->rtld_flags |= RTLD_GLOBAL;
+				dyn_ptr->next = (struct dyn_elf *) malloc(sizeof(struct dyn_elf));
+				_dl_memset (dyn_ptr->next, 0, sizeof (struct dyn_elf));
+				dyn_ptr = dyn_ptr->next;
+				dyn_ptr->dyn = tpnt1;
+
 				tmp = alloca(sizeof(struct init_fini_list)); /* Allocates on stack, no need to free this memory */
 				tmp->tpnt = tpnt1;
 				tmp->next = tcurr->init_fini;
-- 
cgit v1.2.3