diff options
Diffstat (limited to 'data/vim/patches/8.1.0960')
-rw-r--r-- | data/vim/patches/8.1.0960 | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0960 b/data/vim/patches/8.1.0960 new file mode 100644 index 000000000..d0be8afe1 --- /dev/null +++ b/data/vim/patches/8.1.0960 @@ -0,0 +1,127 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.0960 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +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 /// |