diff options
author | Jesse Rosenstock <jmr@ugcs.caltech.edu> | 2002-08-14 19:53:54 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2002-08-14 19:53:54 +0000 |
commit | 093f02000f6f5367e1018e786929d86b2a3ea096 (patch) | |
tree | 919a86c6dc505c79c1bc4f535e2034b7aa80e77a /libjava/java | |
parent | 77893a23f990867ccef065bb78fdff52b1e906c3 (diff) | |
download | gcc-093f02000f6f5367e1018e786929d86b2a3ea096.zip gcc-093f02000f6f5367e1018e786929d86b2a3ea096.tar.gz gcc-093f02000f6f5367e1018e786929d86b2a3ea096.tar.bz2 |
natPosixProcess.cc (cleanup): Added `path' argument.
2002-08-14 Jesse Rosenstock <jmr@ugcs.caltech.edu>
* java/lang/natPosixProcess.cc (cleanup): Added `path' argument.
(startProcess): Allocate path for chdir in async-signal-safe way.
From-SVN: r56330
Diffstat (limited to 'libjava/java')
-rw-r--r-- | libjava/java/lang/natPosixProcess.cc | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/libjava/java/lang/natPosixProcess.cc b/libjava/java/lang/natPosixProcess.cc index a6c049b..ec3eccb 100644 --- a/libjava/java/lang/natPosixProcess.cc +++ b/libjava/java/lang/natPosixProcess.cc @@ -88,7 +88,7 @@ new_string (jstring string) } static void -cleanup (char **args, char **env) +cleanup (char **args, char **env, char *path) { if (args != NULL) { @@ -102,6 +102,8 @@ cleanup (char **args, char **env) _Jv_Free (env[i]); _Jv_Free (env); } + if (path != NULL) + _Jv_Free (path); } // This makes our error handling a bit simpler and it lets us avoid @@ -127,6 +129,7 @@ java::lang::ConcreteProcess::startProcess (jstringArray progarray, // Initialize all locals here to make cleanup simpler. char **args = NULL; char **env = NULL; + char *path = NULL; int inp[2], outp[2], errp[2], msgp[2]; inp[0] = -1; inp[1] = -1; @@ -170,6 +173,11 @@ java::lang::ConcreteProcess::startProcess (jstringArray progarray, env[envp->length] = NULL; } + // We allocate this here because we can't call malloc() after + // the fork. + if (dir != NULL) + path = new_string (dir->getPath ()); + // Create pipes for I/O. MSGP is for communicating exec() // status. if (pipe (inp) || pipe (outp) || pipe (errp) || pipe (msgp) @@ -233,11 +241,9 @@ java::lang::ConcreteProcess::startProcess (jstringArray progarray, close (msgp[0]); // Change directory. - if (dir != NULL) + if (path != NULL) { - // We don't care about leaking memory here; this process - // is about to terminate one way or another. - if (chdir (new_string (dir->getPath ())) != 0) + if (chdir (path) != 0) { char c = errno; write (msgp[1], &c, 1); @@ -319,7 +325,7 @@ java::lang::ConcreteProcess::startProcess (jstringArray progarray, } myclose (msgp[0]); - cleanup (args, env); + cleanup (args, env, path); if (exc != NULL) throw exc; |