Module Name: src
Committed By: joerg
Date: Thu Dec 16 22:47:28 UTC 2010
Modified Files:
src/libexec/ld.elf_so: Makefile rtld.c
Removed Files:
src/libexec/ld.elf_so: xenv.c
Log Message:
Don't use normal environment handling functions from libc, but iterate
once over the array and clean out entries as needed.
To generate a diff of this commit:
cvs rdiff -u -r1.99 -r1.100 src/libexec/ld.elf_so/Makefile
cvs rdiff -u -r1.133 -r1.134 src/libexec/ld.elf_so/rtld.c
cvs rdiff -u -r1.2 -r0 src/libexec/ld.elf_so/xenv.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/libexec/ld.elf_so/Makefile
diff -u src/libexec/ld.elf_so/Makefile:1.99 src/libexec/ld.elf_so/Makefile:1.100
--- src/libexec/ld.elf_so/Makefile:1.99 Sun Dec 5 00:56:06 2010
+++ src/libexec/ld.elf_so/Makefile Thu Dec 16 22:47:27 2010
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.99 2010/12/05 00:56:06 joerg Exp $
+# $NetBSD: Makefile,v 1.100 2010/12/16 22:47:27 joerg Exp $
#
# NOTE: when changing ld.so, ensure that ldd still compiles.
#
@@ -58,7 +58,7 @@
CLIBOBJ!= cd ${NETBSDSRCDIR}/lib/libc && ${PRINTOBJDIR}
-SRCS+= rtld.c reloc.c symbol.c xenv.c xmalloc.c xprintf.c debug.c \
+SRCS+= rtld.c reloc.c symbol.c xmalloc.c xprintf.c debug.c \
map_object.c load.c search.c headers.c paths.c expand.c
.if ${USE_FORT} == "yes"
Index: src/libexec/ld.elf_so/rtld.c
diff -u src/libexec/ld.elf_so/rtld.c:1.133 src/libexec/ld.elf_so/rtld.c:1.134
--- src/libexec/ld.elf_so/rtld.c:1.133 Thu Dec 16 19:59:39 2010
+++ src/libexec/ld.elf_so/rtld.c Thu Dec 16 22:47:27 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: rtld.c,v 1.133 2010/12/16 19:59:39 skrll Exp $ */
+/* $NetBSD: rtld.c,v 1.134 2010/12/16 22:47:27 joerg Exp $ */
/*
* Copyright 1996 John D. Polstra.
@@ -40,7 +40,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: rtld.c,v 1.133 2010/12/16 19:59:39 skrll Exp $");
+__RCSID("$NetBSD: rtld.c,v 1.134 2010/12/16 22:47:27 joerg Exp $");
#endif /* not lint */
#include <err.h>
@@ -312,20 +312,21 @@
*pAUX_phent, *pAUX_phnum, *pAUX_euid, *pAUX_egid,
*pAUX_ruid, *pAUX_rgid;
const AuxInfo *pAUX_pagesz;
- char **env;
+ char **env, **oenvp;
const AuxInfo *aux;
const AuxInfo *auxp;
Elf_Addr *const osp = sp;
bool bind_now = 0;
- const char *ld_bind_now;
+ const char *ld_bind_now, *ld_preload, *ld_library_path;
const char **argv;
const char *execname;
long argc;
const char **real___progname;
const Obj_Entry **real___mainprog_obj;
char ***real_environ;
-#if defined(RTLD_DEBUG)
+#ifdef DEBUG
int i = 0;
+ const char *ld_debug;
#endif
/*
@@ -428,24 +429,68 @@
((pAUX_egid ? (gid_t)pAUX_egid->a_v : getegid()) ==
(pAUX_rgid ? (gid_t)pAUX_rgid->a_v : getgid()));
- ld_bind_now = getenv("LD_BIND_NOW");
+#ifdef DEBUG
+ ld_debug = NULL;
+#endif
+ ld_bind_now = NULL;
+ ld_library_path = NULL;
+ ld_preload = NULL;
+ /*
+ * Inline avoid using normal getenv/unsetenv here as the libc
+ * code is quite a bit more complicated.
+ */
+ for (oenvp = env; *env != NULL; ++env) {
+ static const char bind_var[] = "LD_BIND_NOW=";
+ static const char debug_var[] = "LD_DEBUG=";
+ static const char path_var[] = "LD_LIBRARY_PATH=";
+ static const char preload_var[] = "LD_PRELOAD=";
+#define LEN(x) (sizeof(x) - 1)
+
+ if ((*env)[0] != 'L' || (*env)[1] != 'D') {
+ /*
+ * Special case to skip most entries without
+ * the more expensive calls to strncmp.
+ */
+ *oenvp++ = *env;
+ } else if (strncmp(*env, debug_var, LEN(debug_var)) == 0) {
+ if (_rtld_trust) {
+#ifdef DEBUG
+ ld_debug = *env + LEN(debug_var);
+#endif
+ *oenvp++ = *env;
+ }
+ } else if (strncmp(*env, bind_var, LEN(bind_var)) == 0) {
+ ld_bind_now = *env + LEN(bind_var);
+ } else if (strncmp(*env, path_var, LEN(path_var)) == 0) {
+ if (_rtld_trust) {
+ ld_library_path = *env + LEN(path_var);
+ *oenvp++ = *env;
+ }
+ } else if (strncmp(*env, preload_var, LEN(preload_var)) == 0) {
+ if (_rtld_trust) {
+ ld_preload = *env + LEN(preload_var);
+ *oenvp++ = *env;
+ }
+ } else {
+ *oenvp++ = *env;
+ }
+#undef LEN
+ }
+ *oenvp++ = NULL;
+
if (ld_bind_now != NULL && *ld_bind_now != '\0')
bind_now = true;
if (_rtld_trust) {
#ifdef DEBUG
- const char *ld_debug = getenv("LD_DEBUG");
#ifdef RTLD_DEBUG
debug = 0;
#endif
if (ld_debug != NULL && *ld_debug != '\0')
debug = 1;
#endif
- _rtld_add_paths(execname, &_rtld_paths,
- getenv("LD_LIBRARY_PATH"));
+ _rtld_add_paths(execname, &_rtld_paths, ld_library_path);
} else {
execname = NULL;
- if (xunsetenv("LD_DEBUG") || xunsetenv("LD_LIBRARY_PATH"))
- _rtld_die();
}
_rtld_process_hints(execname, &_rtld_paths, &_rtld_xforms,
_PATH_LD_HINTS);
@@ -512,17 +557,15 @@
_rtld_objmain->mainref = 1;
_rtld_objlist_push_tail(&_rtld_list_main, _rtld_objmain);
- if (_rtld_trust) {
+ if (ld_preload) {
/*
* Pre-load user-specified objects after the main program
* but before any shared object dependencies.
*/
dbg(("preloading objects"));
- if (_rtld_preload(getenv("LD_PRELOAD")) == -1)
- _rtld_die();
- } else
- if (xunsetenv("LD_PRELOAD"))
+ if (_rtld_preload(ld_preload) == -1)
_rtld_die();
+ }
dbg(("loading needed objects"));
if (_rtld_load_needed_objects(_rtld_objmain, RTLD_MAIN) == -1)