Extend the environment variables adding the LD_LIBRARY_PATH
if actually passed when doing shared library tracings through
the ld.so trace capability.

Signed-off-by: Carmelo Amoroso <[email protected]>
---
 utils/ldd.c |   41 ++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 40 insertions(+), 1 deletions(-)

diff --git a/utils/ldd.c b/utils/ldd.c
index 6d08efd..00e46ca 100644
--- a/utils/ldd.c
+++ b/utils/ldd.c
@@ -127,6 +127,10 @@
 #define ELFDATAM       ELFDATA2MSB
 #endif
 
+#include <stdint.h>
+
+#define ARRAY_SIZE(v)  (sizeof(v) / sizeof(*v))
+
 struct library {
        char *name;
        int resolved;
@@ -699,15 +703,50 @@ foo:
                                NULL
                        };
 
+                       /* The 'extended' environment inclusing the 
LD_LIBRARY_PATH */
+                       static char *ext_environment[ARRAY_SIZE(environment) + 
1];
+
+                       char **envp = (char **) environment;
+
+                       char * lib_path = getenv("LD_LIBRARY_PATH");
+
+                       if (lib_path) {
+                               /*
+                                * If the LD_LIBRARY_PATH is set, it needs to 
include it
+                                * into the environment for the new process to 
be spawned
+                                */
+                               uint8_t k;
+                               uint8_t size = ARRAY_SIZE(environment);
+
+                               /* Copy the N-1 environment's entries */
+                               for(k = 0; k < size - 1; k++)
+                                       ext_environment[k] = (char *) 
environment[k];
+
+                               /* Make room for LD_LIBRARY_PATH */
+                               ext_environment[k] = (char *) 
malloc(strlen("LD_LIBRARY_PATH=") + strlen(lib_path) + 1);
+                               strcpy(ext_environment[k], "LD_LIBRARY_PATH=");
+                               strcat(ext_environment[k], lib_path);
+
+                               /* ext_environment[size] is already NULL */
+
+                               /* Use the extended environment */
+                               envp = ext_environment;
+                       }
+
                        if ((pid = vfork()) == 0) {
                                /* Cool, it looks like we should be able to 
actually
                                 * run this puppy.  Do so now... */
-                               execle(filename, filename, NULL, environment);
+                               execle(filename, filename, NULL, envp);
                                _exit(0xdead);
                        }
 
                        /* Wait till it returns */
                        waitpid(pid, &status, 0);
+
+                       /* Do not leak */
+                       if (lib_path)
+                               
free(ext_environment[ARRAY_SIZE(ext_environment) - 2]);
+
                        if (WIFEXITED(status) && WEXITSTATUS(status) == 0) {
                                return 1;
                        }
-- 
1.7.4.4

_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to