-
Notifications
You must be signed in to change notification settings - Fork 10
Description
報告の内容
macOS で job_start
を使用して一定サイズのファイルを in_io
が buffer
で外部プログラムの STDIN
に突っ込んだ際に SEGV
が発生する。
再現手順
- https://gist.github.com/heavenshell/c6c6d019e2aa284623509b0dd106f634#file-stdin-py
job を利用してバッファの内容を STDIN から読み込む Python プログラムで、/tmp/stdin.py
に設置 - https://gist.github.com/heavenshell/c6c6d019e2aa284623509b0dd106f634#file-test-vim
このファイルをtest.vim
として設置 - https://gist.github.com/heavenshell/c6c6d019e2aa284623509b0dd106f634#file-testdata-txt
テスト用のファイルをsample.txt
としてに設置
test.vim
を開く:so %
で autocmd を有効にする:e sample.txt
で開く<S-g>oa<ESC>
でファイル末尾に行き Insert モードで適当に文字を入力し ESC をし、InsertLeave が発生してバッファの内容を stdin.py に送信する
期待する動作は {"count": 15801}
という文字数を数えたものが Vim に返ってくるが、
macOS では SEGV が発生しました。
なお文字数が 15800
以下だと発生しません。
また Linux では 15801 文字以上でも発生しません(適当に文字数を 10 倍とかでかいサイズにしても起きなかったです)。
パッチ
https://gist.github.com/heavenshell/c6c6d019e2aa284623509b0dd106f634#file-src_channel-c-diff
質問
channel_write_input(channel);
を辿って行くと channel_write_in()
-> ch_close_part()
で FD
を閉じているように見えます。
閉じた後に FD_CLR(in_part->ch_fd, wfds);
を呼ぶと SEGV するように見えました(in_part->ch_fd の値は -1
)。
単純に INVALID_FD
の判定で良いのでしょうか?
直接の変更は vim/vim@3c51840#diff-3eef145ca58a199bac70eef155e806aeR4094 こちらの対応によるものだと思いますが、Terminal に影響があるのかがよくわかってないです…。
パッチの添削をお願いしたいです。
Vimのバージョン
8.0.1655(3/31 時点の最新をビルド)
OSの種類/ディストリ/バージョン
- macOS Sierra(El Capitan)
Linux(Ubuntu 16.04)でも確認しましたが、こちらの環境では発生しなかっため、macOS 特有の不具合かもしれません。
使用している or 関係していそうなプラグイン
特になし
その他
FD_CLR の実体は https://github.com/apple/darwin-xnu/blob/0a798f6738bc1db01281fc08ae024145e84df927/bsd/sys/_types/_fd_def.h#L62 こちらです。