patch 7.4.1386
Problem: When the Job exit callback is invoked, the job may be freed too
soon. (Yasuhiro Matsumoto)
Solution: Increase refcount.
diff --git a/src/eval.c b/src/eval.c
index 3fb06d0..cc30308 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -15039,7 +15039,8 @@
typval_T rettv;
int dummy;
- /* invoke the exit callback */
+ /* invoke the exit callback; make sure the refcount is > 0 */
+ ++job->jv_refcount;
argv[0].v_type = VAR_JOB;
argv[0].vval.v_job = job;
argv[1].v_type = VAR_NUMBER;
@@ -15047,10 +15048,11 @@
call_func(job->jv_exit_cb, (int)STRLEN(job->jv_exit_cb),
&rettv, 2, argv, 0L, 0L, &dummy, TRUE, NULL);
clear_tv(&rettv);
+ --job->jv_refcount;
}
if (job->jv_status == JOB_ENDED && job->jv_refcount == 0)
{
- /* The job already was unreferenced, now that it ended it can be
+ /* The job was already unreferenced, now that it ended it can be
* freed. Careful: caller must not use "job" after this! */
job_free(job);
}
diff --git a/src/version.c b/src/version.c
index 9e2f4bd..778d1fc 100644
--- a/src/version.c
+++ b/src/version.c
@@ -749,6 +749,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1386,
+/**/
1385,
/**/
1384,