re PR libgcj/23758 (java::lang::ConcreteProcess::nativeSpawn unsafe)
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. From-SVN: r123676
This commit is contained in:
parent
22931aa4a9
commit
290b7f64b5
5 changed files with 105 additions and 30 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
2007-04-08 David Daney <ddaney@avtrex.com>
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
2007-04-09 H.J. Lu <hongjiu.lu@intel.com>
|
2007-04-09 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* prims.cc (load_jvmti_agent): Add the missing `,'.
|
* prims.cc (load_jvmti_agent): Add the missing `,'.
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
// natPosixProcess.cc - Native side of POSIX process code.
|
// 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.
|
This file is part of libgcj.
|
||||||
|
|
||||||
|
@ -248,16 +249,57 @@ java::lang::PosixProcess::nativeSpawn ()
|
||||||
|
|
||||||
if (envp)
|
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);
|
elts = elements (envp);
|
||||||
|
|
||||||
// Initialize so we can gracefully recover.
|
// 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;
|
env[i] = NULL;
|
||||||
|
|
||||||
for (int i = 0; i < envp->length; ++i)
|
for (i = 0; i < envp->length; ++i)
|
||||||
env[i] = new_string (elts[i]);
|
{
|
||||||
env[envp->length] = NULL;
|
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
|
// 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.
|
// Child process, so remap descriptors, chdir and exec.
|
||||||
if (envp)
|
if (envp)
|
||||||
{
|
environ = env;
|
||||||
// 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// We ignore errors from dup2 because they should never occur.
|
// We ignore errors from dup2 because they should never occur.
|
||||||
dup2 (outp[0], 0);
|
dup2 (outp[0], 0);
|
||||||
|
@ -344,7 +364,7 @@ java::lang::PosixProcess::nativeSpawn ()
|
||||||
close (outp[0]);
|
close (outp[0]);
|
||||||
close (outp[1]);
|
close (outp[1]);
|
||||||
close (msgp[0]);
|
close (msgp[0]);
|
||||||
|
|
||||||
// Change directory.
|
// Change directory.
|
||||||
if (path != NULL)
|
if (path != NULL)
|
||||||
{
|
{
|
||||||
|
|
BIN
libjava/testsuite/libjava.lang/Process_7.jar
Normal file
BIN
libjava/testsuite/libjava.lang/Process_7.jar
Normal file
Binary file not shown.
45
libjava/testsuite/libjava.lang/Process_7.java
Normal file
45
libjava/testsuite/libjava.lang/Process_7.java
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
// Verify we can modify the environment.
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public class Process_7
|
||||||
|
{
|
||||||
|
public static void main(String[] args)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ProcessBuilder pb = new ProcessBuilder("env");
|
||||||
|
Map<String, String> e = pb.environment();
|
||||||
|
e.clear();
|
||||||
|
String v = "process7_value";
|
||||||
|
String k = "PROCESS_7_KEY";
|
||||||
|
e.put(k, v);
|
||||||
|
Process p = pb.start();
|
||||||
|
InputStream is = p.getInputStream();
|
||||||
|
InputStreamReader isr = new InputStreamReader(is);
|
||||||
|
BufferedReader br = new BufferedReader(isr);
|
||||||
|
boolean found = false;
|
||||||
|
|
||||||
|
String result;
|
||||||
|
while ((result = br.readLine()) != null)
|
||||||
|
{
|
||||||
|
if (result.equals(k + '=' + v))
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
System.out.println("bad");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
System.out.println("ok");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
System.out.println(ex.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
1
libjava/testsuite/libjava.lang/Process_7.out
Normal file
1
libjava/testsuite/libjava.lang/Process_7.out
Normal file
|
@ -0,0 +1 @@
|
||||||
|
ok
|
Loading…
Add table
Add a link
Reference in a new issue