From owner-svn-src-all@FreeBSD.ORG Mon Jan 7 17:58:29 2013 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id E7EF1491; Mon, 7 Jan 2013 17:58:29 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id CBAEBA45; Mon, 7 Jan 2013 17:58:29 +0000 (UTC) Received: from svn.freebsd.org (svn.FreeBSD.org [8.8.178.70]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id r07HwTH9039994; Mon, 7 Jan 2013 17:58:29 GMT (envelope-from kib@svn.freebsd.org) Received: (from kib@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id r07HwS5v039985; Mon, 7 Jan 2013 17:58:28 GMT (envelope-from kib@svn.freebsd.org) Message-Id: <201301071758.r07HwS5v039985@svn.freebsd.org> From: Konstantin Belousov Date: Mon, 7 Jan 2013 17:58:28 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r245133 - in head/lib/csu: amd64 arm common i386-elf mips powerpc powerpc64 sparc64 X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 07 Jan 2013 17:58:30 -0000 Author: kib Date: Mon Jan 7 17:58:27 2013 New Revision: 245133 URL: http://svnweb.freebsd.org/changeset/base/245133 Log: Only assign the environ in the startup code when environ is NULL. Preloaded library could have changed the environment, and unconditional assingment to the environ undoes the customization. The binaries needs to be recompiled to get the fix. Move the common code to set up environ and __progname into the helper. Note that ia64 possibly not fixed, due to it still using old csu. Reported and tested by: John Hein Reviewed by: kan, scf Approved by: secteam (simon) MFC after: 2 weeks Modified: head/lib/csu/amd64/crt1.c head/lib/csu/arm/crt1.c head/lib/csu/common/ignore_init.c head/lib/csu/i386-elf/crt1_c.c head/lib/csu/mips/crt1.c head/lib/csu/powerpc/crt1.c head/lib/csu/powerpc64/crt1.c head/lib/csu/sparc64/crt1.c Modified: head/lib/csu/amd64/crt1.c ============================================================================== --- head/lib/csu/amd64/crt1.c Mon Jan 7 16:38:13 2013 (r245132) +++ head/lib/csu/amd64/crt1.c Mon Jan 7 17:58:27 2013 (r245133) @@ -61,9 +61,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); if (&_DYNAMIC != NULL) atexit(cleanup); Modified: head/lib/csu/arm/crt1.c ============================================================================== --- head/lib/csu/arm/crt1.c Mon Jan 7 16:38:13 2013 (r245132) +++ head/lib/csu/arm/crt1.c Mon Jan 7 17:58:27 2013 (r245133) @@ -98,10 +98,7 @@ __start(int argc, char **argv, char **en const struct Struct_Obj_Entry *obj __unused, void (*cleanup)(void)) { - environ = env; - - if (argc > 0 && argv[0] != NULL) - handle_progname(argv[0]); + handle_argv(argc, argv, env); if (ps_strings != (struct ps_strings *)0) __ps_strings = ps_strings; Modified: head/lib/csu/common/ignore_init.c ============================================================================== --- head/lib/csu/common/ignore_init.c Mon Jan 7 16:38:13 2013 (r245132) +++ head/lib/csu/common/ignore_init.c Mon Jan 7 17:58:27 2013 (r245133) @@ -87,14 +87,18 @@ handle_static_init(int argc, char **argv } 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; + } } } Modified: head/lib/csu/i386-elf/crt1_c.c ============================================================================== --- head/lib/csu/i386-elf/crt1_c.c Mon Jan 7 16:38:13 2013 (r245132) +++ head/lib/csu/i386-elf/crt1_c.c Mon Jan 7 17:58:27 2013 (r245133) @@ -61,10 +61,7 @@ _start1(fptr cleanup, int argc, char *ar char **env; env = argv + argc + 1; - environ = env; - if (argc > 0 && argv[0] != NULL) - handle_progname(argv[0]); - + handle_argv(argc, argv, env); if (&_DYNAMIC != NULL) atexit(cleanup); else Modified: head/lib/csu/mips/crt1.c ============================================================================== --- head/lib/csu/mips/crt1.c Mon Jan 7 16:38:13 2013 (r245132) +++ head/lib/csu/mips/crt1.c Mon Jan 7 17:58:27 2013 (r245133) @@ -71,9 +71,7 @@ __start(char **ap, argc = * (long *) 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); if (&_DYNAMIC != NULL) atexit(cleanup); Modified: head/lib/csu/powerpc/crt1.c ============================================================================== --- head/lib/csu/powerpc/crt1.c Mon Jan 7 16:38:13 2013 (r245132) +++ head/lib/csu/powerpc/crt1.c Mon Jan 7 17:58:27 2013 (r245133) @@ -81,10 +81,8 @@ _start(int argc, char **argv, char **env struct ps_strings *ps_strings) { - environ = env; - if (argc > 0 && argv[0] != NULL) - handle_progname(argv[0]); + handle_argv(argc, argv, env); if (ps_strings != (struct ps_strings *)0) __ps_strings = ps_strings; Modified: head/lib/csu/powerpc64/crt1.c ============================================================================== --- head/lib/csu/powerpc64/crt1.c Mon Jan 7 16:38:13 2013 (r245132) +++ head/lib/csu/powerpc64/crt1.c Mon Jan 7 17:58:27 2013 (r245133) @@ -81,10 +81,7 @@ _start(int argc, char **argv, char **env struct ps_strings *ps_strings) { - environ = env; - - if (argc > 0 && argv[0] != NULL) - handle_progname(argv[0]); + handle_argv(argc, argv, env); if (ps_strings != (struct ps_strings *)0) __ps_strings = ps_strings; Modified: head/lib/csu/sparc64/crt1.c ============================================================================== --- head/lib/csu/sparc64/crt1.c Mon Jan 7 16:38:13 2013 (r245132) +++ head/lib/csu/sparc64/crt1.c Mon Jan 7 17:58:27 2013 (r245133) @@ -85,9 +85,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); if (&_DYNAMIC != NULL) atexit(cleanup);