libcsu: Assign environment when environ is NULL
authorJohn Marino <draco@marino.st>
Sun, 10 Feb 2013 11:32:58 +0000 (12:32 +0100)
committerJohn Marino <draco@marino.st>
Sun, 10 Feb 2013 11:50:10 +0000 (12:50 +0100)
Preloaded libraries can change the environment.  The current logic will
unconditionally reassign the environment, undoing any previous
customization.  This change preserves the previous customization.

Taken-from: FreeBSD SVN 245133 (07 Jan 2013)

lib/csu/common/initfini.c
lib/csu/i386/crt1_c.c
lib/csu/x86_64/crt1.c

index a6760bb..48dd815 100644 (file)
@@ -84,14 +84,18 @@ handle_static_init(int argc, char **argv, char **env)
 }
 
 static inline void
-handle_progname(const char *v)
+handle_argv(int argc, char *argv[], char **env)
 {
        const char *s;
 
-       __progname = v;
-       for (s = __progname; *s != '\0'; s++) {
-               if (*s == '/')
-                       __progname = s + 1;
+       if (environ == NULL)
+               environ = env;
+       if (argc > 0 && argv[0] != NULL) {
+               __progname = argv[0];
+               for (s = __progname; *s != '\0'; s++) {
+                       if (*s == '/')
+                               __progname = s + 1;
+                }
        }
 }
 
index 79c696f..d9b1fad 100644 (file)
@@ -57,9 +57,7 @@ _start1(fptr cleanup, int argc, char *argv[])
     char **env;
 
     env = argv + argc + 1;
-    environ = env;
-    if (argc > 0 && argv[0] != NULL)
-       handle_progname(argv[0]);
+    handle_argv(argc, argv, env);
 
     /*
      * Setup the initial TLS space.  The RTLD does not set up our TLS
index 665eef8..d1acef8 100644 (file)
@@ -56,9 +56,7 @@ _start(char **ap, void (*cleanup)(void))
        argc = *(long *)(void *)ap;
        argv = ap + 1;
        env = ap + 2 + argc;
-       environ = env;
-       if (argc > 0 && argv[0] != NULL)
-               handle_progname(argv[0]);
+       handle_argv(argc, argv, env);
 
        /*
         * Setup the initial TLS space.  The RTLD does not set up our TLS