(wangle) fix after-delete assert
[folly.git] / folly / Subprocess.cpp
index ac8eab60d7a1423c8db0af85ef0b0998885c870b..c17e8849e8f080a2a722b84a35b5317a6a68b2df 100644 (file)
@@ -39,7 +39,6 @@
 
 #include <folly/Conv.h>
 #include <folly/Exception.h>
-#include <folly/FileUtil.h>
 #include <folly/ScopeGuard.h>
 #include <folly/String.h>
 #include <folly/io/Cursor.h>
@@ -256,29 +255,25 @@ void Subprocess::spawn(
   // in case it fails before calling exec()
   int errFds[2];
 #if FOLLY_HAVE_PIPE2
-  int r = ::pipe2(errFds, O_CLOEXEC);
+  checkUnixError(::pipe2(errFds, O_CLOEXEC), "pipe2");
 #else
-  int r = ::pipe(errFds);
+  checkUnixError(::pipe(errFds), "pipe");
 #endif
-  checkUnixError(r, "pipe");
   SCOPE_EXIT {
     CHECK_ERR(::close(errFds[0]));
     if (errFds[1] >= 0) {
       CHECK_ERR(::close(errFds[1]));
     }
   };
-  // Ask the child to close the read end of the error pipe.
-  options.fdActions_[errFds[0]] = CLOSE;
 
 #if !FOLLY_HAVE_PIPE2
-  r = fcntl(errFds[0], F_SETFD, FD_CLOEXEC);
-  checkUnixError(r, "set FD_CLOEXEC");
+  // Ask the child to close the read end of the error pipe.
+  checkUnixError(fcntl(errFds[0], F_SETFD, FD_CLOEXEC), "set FD_CLOEXEC");
   // Set the close-on-exec flag on the write side of the pipe.
   // This way the pipe will be closed automatically in the child if execve()
   // succeeds.  If the exec fails the child can write error information to the
   // pipe.
-  r = fcntl(errFds[1], F_SETFD, FD_CLOEXEC);
-  checkUnixError(r, "set FD_CLOEXEC");
+  checkUnixError(fcntl(errFds[1], F_SETFD, FD_CLOEXEC), "set FD_CLOEXEC");
 #endif
 
   // Perform the actual work of setting up pipes then forking and
@@ -454,12 +449,9 @@ int Subprocess::prepareChild(const Options& options,
     }
   }
 
-  // Close parent's ends of all pipes
-  for (auto& p : pipes_) {
-    if (::close(p.parentFd) == -1) {
-      return errno;
-    }
-  }
+  // We don't have to explicitly close the parent's end of all pipes,
+  // as they all have the FD_CLOEXEC flag set and will be closed at
+  // exec time.
 
   // Close all fds that we're supposed to close.
   for (auto& p : options.fdActions_) {
@@ -501,7 +493,6 @@ int Subprocess::runChild(const char* executable,
                          char** argv, char** env,
                          const Options& options) const {
   // Now, finally, exec.
-  int r;
   if (options.usePath_) {
     ::execvp(executable, argv);
   } else {
@@ -826,4 +817,3 @@ Initializer initializer;
 }  // namespace
 
 }  // namespace folly
-