Skip to content

macOS で job_start を使い一定サイズ以上の文字列を送信すると SEGV する #1161

@heavenshell

Description

@heavenshell

報告の内容

macOS で job_start を使用して一定サイズのファイルを in_iobuffer で外部プログラムの STDIN に突っ込んだ際に SEGV が発生する。

再現手順

  1. test.vim を開く
  2. :so % で autocmd を有効にする
  3. :e sample.txt で開く
  4. <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 こちらです。

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions