summaryrefslogtreecommitdiff
path: root/libexec/ld.so
diff options
context:
space:
mode:
authorDale Rahn <drahn@cvs.openbsd.org>2004-02-23 20:47:40 +0000
committerDale Rahn <drahn@cvs.openbsd.org>2004-02-23 20:47:40 +0000
commitc1ecfaeb24fab9bbb95082794e7ab1a1989d41e7 (patch)
tree904f3b0e31a0fbbb9da800101b7ce5800a58d93e /libexec/ld.so
parente1d553c77d0696c87302c5d1659dca3cae8971b2 (diff)
Set the user variable environ early in ld.so so that library constructors can
properly see the environment. Fixes problem with MALLOC_OPTIONS on dynamic executables. ok deraadt@
Diffstat (limited to 'libexec/ld.so')
-rw-r--r--libexec/ld.so/loader.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/libexec/ld.so/loader.c b/libexec/ld.so/loader.c
index 1b886448504..88e20cf13e2 100644
--- a/libexec/ld.so/loader.c
+++ b/libexec/ld.so/loader.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: loader.c,v 1.72 2004/02/10 14:12:22 drahn Exp $ */
+/* $OpenBSD: loader.c,v 1.73 2004/02/23 20:47:39 drahn Exp $ */
/*
* Copyright (c) 1998 Per Fogelstrom, Opsycon AB
@@ -54,6 +54,7 @@ void _dl_debug_state(void);
void _dl_setup_env(char **);
void _dl_dtors(void);
void _dl_boot_bind(const long, long *, Elf_Dyn *);
+void _dl_fixup_user_env(void);
const char *_dl_progname;
int _dl_pagesz;
@@ -129,6 +130,7 @@ _dl_dopreload(char *paths)
* grab interesting environment variables, zap bad env vars if
* issetugid
*/
+char **_dl_so_envp;
void
_dl_setup_env(char **envp)
{
@@ -168,6 +170,7 @@ _dl_setup_env(char **envp)
_dl_unsetenv("LD_NORANDOM", envp);
}
}
+ _dl_so_envp = envp;
}
/*
@@ -334,6 +337,9 @@ _dl_boot(const char **argv, char **envp, const long loff, long *dl_data)
_dl_add_object(dyn_obj);
dyn_obj->status |= STAT_RELOC_DONE;
+ if (_dl_traceld == NULL)
+ _dl_fixup_user_env();
+
/*
* Everything should be in place now for doing the relocation
* and binding. Call _dl_rtld to do the job. Fingers crossed.
@@ -709,3 +715,26 @@ _dl_unsetenv(const char *var, char **env)
env++;
}
}
+
+/*
+ * _dl_fixup_user_env()
+ *
+ * Set the user environment so that programs can use the environment
+ * while running constructors. Specifically, MALLOC_OPTIONS= for malloc()
+ */
+void
+_dl_fixup_user_env(void)
+{
+ const Elf_Sym *sym;
+ Elf_Addr ooff;
+ struct elf_object dummy_obj;
+
+ dummy_obj.dyn.symbolic = 0;
+ dummy_obj.load_name = "ld.so";
+
+ sym = NULL;
+ ooff = _dl_find_symbol("environ", _dl_objects, &sym,
+ SYM_SEARCH_ALL|SYM_NOWARNNOTFOUND|SYM_PLT, 0, &dummy_obj);
+ if (sym != NULL)
+ *((char ***)(sym->st_value + ooff)) = _dl_so_envp;
+}