From 5cb7a3e7ad4ce01e1f091f232ed03d1fd7300a66 Mon Sep 17 00:00:00 2001 From: Mark Hatle Date: Tue, 22 Mar 2016 16:43:06 -0500 Subject: [PATCH] Fix LD_PRELOAD w/o rtld case 2016-03-22 Mark Hatle * src/gather.c, src/get.c: Fix LD_PRELOAD Signed-off-by: Mark Hatle --- ChangeLog | 3 +++ src/gather.c | 18 ++++++++++++++---- src/get.c | 21 +++++++++++++++------ 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2417340..f6e75b2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2016-03-22 Mark Hatle + * src/gather.c, src/get.c: Fix LD_PRELOAD + 2016-03-18 Donn Seeley * src/rtld/rtld.c: rewrite build_local_scope to ensure breadth-first processing diff --git a/src/gather.c b/src/gather.c index c61626e..751822c 100644 --- a/src/gather.c +++ b/src/gather.c @@ -166,10 +166,20 @@ gather_deps (DSO *dso, struct prelink_entry *ent) } argv[i++] = ent_filename; argv[i] = NULL; - envp[0] = "LD_TRACE_LOADED_OBJECTS=1"; - envp[1] = "LD_TRACE_PRELINKING=1"; - envp[2] = "LD_WARN="; - envp[3] = NULL; + + j = 0; + if(etype == ET_EXEC && ld_preload) + { + p = alloca (sizeof "LD_PRELOAD=" + strlen (ld_preload) + 1); + strcpy (stpcpy (p, "LD_PRELOAD="), ld_preload); + envp[j++] = p; + } + + envp[j++] = "LD_TRACE_LOADED_OBJECTS=1"; + envp[j++] = "LD_TRACE_PRELINKING=1"; + envp[j++] = "LD_WARN="; + envp[j] = NULL; + f = execve_open (dl, (char * const *)argv, (char * const *)envp); } else diff --git a/src/get.c b/src/get.c index 0d37bca..4db1ae2 100644 --- a/src/get.c +++ b/src/get.c @@ -643,8 +643,8 @@ prelink_get_relocations (struct prelink_info *info) FILE *f; DSO *dso = info->dso; const char *argv[8]; - const char *envp[4]; - int i, ret, status; + const char *envp[5]; + int i, j, ret, status; char *p; const char *dl = dynamic_linker ?: dso->arch->dynamic_linker; const char *ent_filename; @@ -693,12 +693,21 @@ prelink_get_relocations (struct prelink_info *info) } argv[i++] = ent_filename; argv[i] = NULL; - envp[0] = "LD_TRACE_LOADED_OBJECTS=1"; - envp[1] = "LD_BIND_NOW=1"; + + j = 0; + if(etype == ET_EXEC && ld_preload) + { + p = alloca (sizeof "LD_PRELOAD=" + strlen (ld_preload)); + strcpy (stpcpy (p, "LD_PRELOAD="), ld_preload); + envp[j++] = p; + } + envp[j++] = "LD_TRACE_LOADED_OBJECTS=1"; + envp[j++] = "LD_BIND_NOW=1"; p = alloca (sizeof "LD_TRACE_PRELINKING=" + strlen (info->ent->filename)); strcpy (stpcpy (p, "LD_TRACE_PRELINKING="), info->ent->filename); - envp[2] = p; - envp[3] = NULL; + envp[j++] = p; + envp[j] = NULL; + ret = 2; f = execve_open (dl, (char * const *)argv, (char * const *)envp); }