diff options
author | daney <daney@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-04-09 17:40:20 +0000 |
---|---|---|
committer | daney <daney@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-04-09 17:40:20 +0000 |
commit | 6a341486829ba4728ee87a74b203462e3c661e46 (patch) | |
tree | b1c737c188f5f8453ba34c21ec12226fd1b5c954 /libjava/java/lang | |
parent | 6be2333a3345cc46e745db7280c1bfc2c1326018 (diff) | |
download | gcc-6a341486829ba4728ee87a74b203462e3c661e46.tar.gz |
PR libgcj/23758
* java/lang/natPosixProcess.cc (nativeSpawn): Move building of
environment before the fork.
* testsuite/libjava.lang/Process_7.java: New test.
* testsuite/libjava.lang/Process_7.out: Its expected results.
* testsuite/libjava.lang/Process_7.jar: Generated file.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@123676 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/java/lang')
-rw-r--r-- | libjava/java/lang/natPosixProcess.cc | 80 |
1 files changed, 50 insertions, 30 deletions
diff --git a/libjava/java/lang/natPosixProcess.cc b/libjava/java/lang/natPosixProcess.cc index 6763273546c..252da6e80ab 100644 --- a/libjava/java/lang/natPosixProcess.cc +++ b/libjava/java/lang/natPosixProcess.cc @@ -1,6 +1,7 @@ // natPosixProcess.cc - Native side of POSIX process code. -/* Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation +/* Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007 + Free Software Foundation This file is part of libgcj. @@ -248,16 +249,57 @@ java::lang::PosixProcess::nativeSpawn () if (envp) { - env = (char **) _Jv_Malloc ((envp->length + 1) * sizeof (char *)); + bool need_path = true; + bool need_ld_library_path = true; + int i; + + // Preserve PATH and LD_LIBRARY_PATH unless specified + // explicitly. We need three extra slots. Potentially PATH + // and LD_LIBRARY_PATH will be added plus the NULL + // termination. + env = (char **) _Jv_Malloc ((envp->length + 3) * sizeof (char *)); elts = elements (envp); // Initialize so we can gracefully recover. - for (int i = 0; i <= envp->length; ++i) + for (i = 0; i < envp->length + 3; ++i) env[i] = NULL; - for (int i = 0; i < envp->length; ++i) - env[i] = new_string (elts[i]); - env[envp->length] = NULL; + for (i = 0; i < envp->length; ++i) + { + env[i] = new_string (elts[i]); + if (!strncmp (env[i], "PATH=", sizeof("PATH="))) + need_path = false; + if (!strncmp (env[i], "LD_LIBRARY_PATH=", + sizeof("LD_LIBRARY_PATH="))) + need_ld_library_path = false; + } + + if (need_path) + { + char *path_val = getenv ("PATH"); + if (path_val) + { + env[i] = (char *) _Jv_Malloc (strlen (path_val) + + sizeof("PATH=") + 1); + strcpy (env[i], "PATH="); + strcat (env[i], path_val); + i++; + } + } + if (need_ld_library_path) + { + char *path_val = getenv ("LD_LIBRARY_PATH"); + if (path_val) + { + env[i] = + (char *) _Jv_Malloc (strlen (path_val) + + sizeof("LD_LIBRARY_PATH=") + 1); + strcpy (env[i], "LD_LIBRARY_PATH="); + strcat (env[i], path_val); + i++; + } + } + env[i] = NULL; } // We allocate this here because we can't call malloc() after @@ -303,29 +345,7 @@ java::lang::PosixProcess::nativeSpawn () { // Child process, so remap descriptors, chdir and exec. if (envp) - { - // Preserve PATH and LD_LIBRARY_PATH unless specified - // explicitly. - char *path_val = getenv ("PATH"); - char *ld_path_val = getenv ("LD_LIBRARY_PATH"); - environ = env; - if (path_val && getenv ("PATH") == NULL) - { - char *path_env = - (char *) _Jv_Malloc (strlen (path_val) + 5 + 1); - strcpy (path_env, "PATH="); - strcat (path_env, path_val); - putenv (path_env); - } - if (ld_path_val && getenv ("LD_LIBRARY_PATH") == NULL) - { - char *ld_path_env = - (char *) _Jv_Malloc (strlen (ld_path_val) + 16 + 1); - strcpy (ld_path_env, "LD_LIBRARY_PATH="); - strcat (ld_path_env, ld_path_val); - putenv (ld_path_env); - } - } + environ = env; // We ignore errors from dup2 because they should never occur. dup2 (outp[0], 0); @@ -344,7 +364,7 @@ java::lang::PosixProcess::nativeSpawn () close (outp[0]); close (outp[1]); close (msgp[0]); - + // Change directory. if (path != NULL) { |