To: vim_dev@googlegroups.com Subject: Patch 8.1.0960 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.0960 Problem: When using ConPTY garbage collection has undefined behavior. Solution: Free the channel in a better way. (Nobuhiro Takasaki, closes #4020) Files: src/channel.c *** ../vim-8.1.0959/src/channel.c 2019-02-17 17:44:36.199875566 +0100 --- src/channel.c 2019-02-20 22:44:26.019845642 +0100 *************** *** 191,197 **** static int did_log_msg = TRUE; ! #ifndef PROTO /* prototype is in vim.h */ void ch_log(channel_T *ch, const char *fmt, ...) { --- 191,197 ---- static int did_log_msg = TRUE; ! #ifndef PROTO // prototype is in proto.h void ch_log(channel_T *ch, const char *fmt, ...) { *************** *** 4348,4367 **** { channel->ch_to_be_closed = (1U << PART_COUNT); channel_close_now(channel); ! /* channel may have been freed, start over */ channel = first_channel; continue; } if (channel->ch_to_be_freed || channel->ch_killing) { channel_free(channel); ! /* channel has been freed, start over */ channel = first_channel; continue; } if (channel->ch_refcount == 0 && !channel_still_useful(channel)) { ! /* channel is no longer useful, free it */ channel_free(channel); channel = first_channel; part = PART_SOCK; --- 4348,4372 ---- { channel->ch_to_be_closed = (1U << PART_COUNT); channel_close_now(channel); ! // channel may have been freed, start over channel = first_channel; continue; } if (channel->ch_to_be_freed || channel->ch_killing) { + if (channel->ch_killing) + { + channel_free_contents(channel); + channel->ch_job->jv_channel = NULL; + } channel_free(channel); ! // channel has been freed, start over channel = first_channel; continue; } if (channel->ch_refcount == 0 && !channel_still_useful(channel)) { ! // channel is no longer useful, free it channel_free(channel); channel = first_channel; part = PART_SOCK; *************** *** 5487,5501 **** channel_need_redraw = TRUE; } ! if (job->jv_channel != NULL ! && job->jv_channel->ch_anonymous_pipe && !job->jv_channel->ch_killing) ! { ! ++safe_to_invoke_callback; ! channel_free_contents(job->jv_channel); ! job->jv_channel->ch_job = NULL; ! job->jv_channel = NULL; ! --safe_to_invoke_callback; ! } // Do not free the job in case the close callback of the associated channel // isn't invoked yet and may get information by job_info(). --- 5492,5499 ---- channel_need_redraw = TRUE; } ! if (job->jv_channel != NULL && job->jv_channel->ch_anonymous_pipe) ! job->jv_channel->ch_killing = TRUE; // Do not free the job in case the close callback of the associated channel // isn't invoked yet and may get information by job_info(). *** ../vim-8.1.0959/src/version.c 2019-02-20 22:18:59.990044254 +0100 --- src/version.c 2019-02-20 22:43:03.024385639 +0100 *************** *** 781,782 **** --- 781,784 ---- { /* Add new patch number below this line */ + /**/ + 960, /**/ -- The average life of an organization chart is six months. You can safely ignore any order from your boss that would take six months to complete. (Scott Adams - The Dilbert principle) /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///