mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
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 <jhein@symmetricom.com> Reviewed by: kan, scf Approved by: secteam (simon) MFC after: 2 weeks
This commit is contained in:
parent
878b1fbdce
commit
d549ead6a9
8 changed files with 16 additions and 29 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -98,10 +98,7 @@ __start(int argc, char **argv, char **env, struct ps_strings *ps_strings,
|
|||
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;
|
||||
|
|
|
|||
|
|
@ -87,14 +87,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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -61,10 +61,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);
|
||||
if (&_DYNAMIC != NULL)
|
||||
atexit(cleanup);
|
||||
else
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -85,9 +85,7 @@ _start(char **ap, void (*cleanup)(void), struct Struct_Obj_Entry *obj __unused,
|
|||
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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue