From 290b7f64b5e3bc1dad14911be133ba5f75fb600b Mon Sep 17 00:00:00 2001 From: David Daney Date: Mon, 9 Apr 2007 17:40:20 +0000 Subject: [PATCH] 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 --- libjava/ChangeLog | 9 ++ libjava/java/lang/natPosixProcess.cc | 80 +++++++++++------- libjava/testsuite/libjava.lang/Process_7.jar | Bin 0 -> 1618 bytes libjava/testsuite/libjava.lang/Process_7.java | 45 ++++++++++ libjava/testsuite/libjava.lang/Process_7.out | 1 + 5 files changed, 105 insertions(+), 30 deletions(-) create mode 100644 libjava/testsuite/libjava.lang/Process_7.jar create mode 100644 libjava/testsuite/libjava.lang/Process_7.java create mode 100644 libjava/testsuite/libjava.lang/Process_7.out diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 5869b0c5f3b7..361877ee1eba 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,12 @@ +2007-04-08 David Daney + + 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 * prims.cc (load_jvmti_agent): Add the missing `,'. diff --git a/libjava/java/lang/natPosixProcess.cc b/libjava/java/lang/natPosixProcess.cc index 6763273546cc..252da6e80abd 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) { diff --git a/libjava/testsuite/libjava.lang/Process_7.jar b/libjava/testsuite/libjava.lang/Process_7.jar new file mode 100644 index 0000000000000000000000000000000000000000..261578e8a546534a78e7bb73abfe95b5bc5e0f84 GIT binary patch literal 1618 zc-jl_W@Zs#U|`^2c*4e6S!IOi5fuBK?A)qKfIkmVr-dry^C$YFVG=!6Z zdCejTHxLf3U}5;e_=T}H9-|zP;p63Z=oamc*v)cdM zcgy|7=i~qX`DNV@zCn9o^TGL>&e-Tr4_~gbL$b>3imvIh)yJxGG`Ao8EXwx2CoN-Y zH_ti`lfw_@8FR<9ao4fRRY>ldJnNwN>Z3B-*R8aiYs@k!E$*uEs->O(d6(@j^42yk zQR8P)>xc|7ZB`W7In#z`&bo+M8|QVTseCcwk>iq@wmH;Szrfom-g{rEv3%1MP4jIj zUlJUa+|XUIq3N-O<3rCyk;?*~uuZ)t-FfYCnD#8W=m76dKb!VMPIbw?tsEjY`dMF} zl&*`i+jHPT=&E$%t-F@K3VnAtbCaj8{@Jt3FRu<>9sYdtq3bJ}rVA|W@e1uSm-Uo; zo4;tTaBh01&@quY2Q8iktXm;w$?Y~TH0Mj3$@xdAoQ7KKd{+p(S|9Z6^`4@e3tCnr z$LJdInAm2fy^(ZuI+V?m$bQl&oRdNFxq+sYjjM*Mj4cOGyn4;-O*dcNlGomRivAinzjYD^SR$n_ddqDM_1{5x1H75 zc^4|&5ANRKqwkW;Q++~dU z6Cxd@u50Mm?Oyfjsj{lc>Nvr-XEk=@?N+tmdbIG@#G}5P+H3vOm&ZJGWtD&6EEO8u zll6h2PvmIsqnC%ZG@o2);t{Rnv}8Kx=ghjdUyBu&YT;&+dmg(%3r>@VM}|( zo#(T@*dNM>xOcoY=f+>|dp8cpoNtxV^Sx5Aw5?U@-fzaZ?@R38tbX`6C+6Sh`}>>! zu?N&0>pkFZTJy(6U`~ho3ojvG!|SZGPcgrH>@Icp{l^3QV#^L{b6mXH8y9s}(W?DL zBHvmT=)ptlH>&;(^LGkL>mrv9CUCUs5Z-{N!hi%DxAR$36%j zdn@+#*4gSF-keK!yWcNZ?2*g!P+G!3bA93+SI+I4^9AoTx=xwBC~rXzm#KZ9%_@khVn70%z_QBMHN;WZ)6Y#GYbh0gQqEPXYN{Flc}74if~?oq z(a+P(H8@1i*A1&NpMB4q_VL!$yU6RUt993R9;c=}!}U9}}hquJxd zv}aSrmM<$PWMl~NW@Hj)##O-b!acC05kz7Xx2zBsgjO&>O~U1Um`MT*ZynbF%|{9h k3^Q;A1H=qQuxnl*n}HH2D8{j}fwV9K;awmd&kEuJ0L?0m+W-In literal 0 Hc-jL100001 diff --git a/libjava/testsuite/libjava.lang/Process_7.java b/libjava/testsuite/libjava.lang/Process_7.java new file mode 100644 index 000000000000..d6f654eb2e0d --- /dev/null +++ b/libjava/testsuite/libjava.lang/Process_7.java @@ -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 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()); + } + } +} diff --git a/libjava/testsuite/libjava.lang/Process_7.out b/libjava/testsuite/libjava.lang/Process_7.out new file mode 100644 index 000000000000..9766475a4185 --- /dev/null +++ b/libjava/testsuite/libjava.lang/Process_7.out @@ -0,0 +1 @@ +ok -- 2.47.2