changeset 32092:60f330eb0376 v9.0.1377

patch 9.0.1377: job_status() may return "dead" if the process parent changed Commit: https://github.com/vim/vim/commit/5c6a3c9bad67c2ce766f55dbecb3461f14833a42 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 4 13:23:26 2023 +0000 patch 9.0.1377: job_status() may return "dead" if the process parent changed Problem: job_status() may return "dead" if the process parent changed. Solution: Call mch_process_running() to check if the job is still alive.
author Bram Moolenaar <Bram@vim.org>
date Sat, 04 Mar 2023 14:30:04 +0100
parents 136482cd3234
children 1b6ac899f079
files src/os_unix.c src/version.c
diffstat 2 files changed, 10 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -5863,10 +5863,17 @@ mch_job_status(job_T *job)
 # endif
     if (wait_pid == -1)
     {
+	int waitpid_errno = errno;
+	if (waitpid_errno == ECHILD && mch_process_running(job->jv_pid))
+	    // The process is alive, but it was probably reparented (for
+	    // example by ptrace called by a debugger like lldb or gdb).
+	    // Note: This assumes that process IDs are not reused.
+	    return "run";
+
 	// process must have exited
 	if (job->jv_status < JOB_ENDED)
 	    ch_log(job->jv_channel, "Job no longer exists: %s",
-							      strerror(errno));
+						      strerror(waitpid_errno));
 	goto return_dead;
     }
     if (wait_pid == 0)
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1377,
+/**/
     1376,
 /**/
     1375,