about summary refs log tree commit diff
diff options
context:
space:
mode:
authorwaterlens <82268070+waterlens@users.noreply.github.com>2021-07-16 17:56:51 +0800
committerwaterlens <82268070+waterlens@users.noreply.github.com>2021-07-16 17:56:51 +0800
commit3c384cee52e002244caaa0ef0288aadcb85be691 (patch)
treefe7a82ce28bc9bb5d80f0be35d00269437fd79b8
parent057050a95bdfc5849a893208c53c7b2a081c6808 (diff)
downloadrust-3c384cee52e002244caaa0ef0288aadcb85be691.tar.gz
rust-3c384cee52e002244caaa0ef0288aadcb85be691.zip
Fix panics on Windows when the build was cancelled
-rw-r--r--src/bootstrap/job.rs20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/bootstrap/job.rs b/src/bootstrap/job.rs
index 2fe9b06e426..5c0322e18a4 100644
--- a/src/bootstrap/job.rs
+++ b/src/bootstrap/job.rs
@@ -103,12 +103,20 @@ pub unsafe fn setup(build: &mut Build) {
     };
 
     let parent = OpenProcess(PROCESS_DUP_HANDLE, FALSE, pid.parse().unwrap());
-    assert!(
-        !parent.is_null(),
-        "PID `{}` doesn't seem to exist: {}",
-        pid,
-        io::Error::last_os_error()
-    );
+
+    // If we get a null parent pointer here, it is possible that either
+    // we have got an invalid pid or the parent process has been closed.
+    // Since the first case rarely happens
+    // (only when wrongly setting the environmental variable),
+    // so it might be better to improve the experience of the second case
+    // when users have interrupted the parent process and we don't finish
+    // duplicating the handle yet.
+    // We just need close the job object if that occurs.
+    if parent.is_null() {
+        CloseHandle(job);
+        return;
+    }
+
     let mut parent_handle = ptr::null_mut();
     let r = DuplicateHandle(
         GetCurrentProcess(),