New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vim-fzで端末Vimが落ちる(SEGV) #1081

Closed
miyakogi opened this Issue Sep 4, 2017 · 24 comments

Comments

Projects
None yet
6 participants
@miyakogi

miyakogi commented Sep 4, 2017

質問・報告の内容

mattn/vim-fzというプラグインと以下のオプションの組み合わせでVimが落ちます(SEGV)。

set conceallevel=2
set lazyredraw
syntax enable
  • ~/.vim/pack/remote/start/git clone https://github.com/mattn/vim-fz
  • 上記の設定をa.vimとして保存しvim -Nu a.vim a.vimで起動
    • ファイルを開いていないと再現しない?
  • :Fzを実行
    • 一回では落ちない場合もありますが何度か実行するとvimが落ちます

Vimのバージョン

  • 8.0.1052
+acl             +file_in_path    +mouse_sgr       +tag_old_static
+arabic          +find_in_path    -mouse_sysmouse  -tag_any_white
+autocmd         +float           +mouse_urxvt     -tcl
+balloon_eval    +folding         +mouse_xterm     +termguicolors
+browse          -footer          +multi_byte      +terminal
++builtin_terms  +fork()          +multi_lang      +terminfo
+byte_offset     +gettext         -mzscheme        +termresponse
+channel         -hangul_input    +netbeans_intg   +textobjects
+cindent         +iconv           +num64           +timers
+clientserver    +insert_expand   +packages        +title
+clipboard       +job             +path_extra      +toolbar
+cmdline_compl   +jumplist        -perl            +user_commands
+cmdline_hist    +keymap          +persistent_undo +vertsplit
+cmdline_info    +lambda          +postscript      +virtualedit
+comments        +langmap         +printer         +visual
+conceal         +libcall         -profile         +visualextra
+cryptv          +linebreak       +python/dyn      +viminfo
+cscope          +lispindent      +python3/dyn     +vreplace
+cursorbind      +listcmds        +quickfix        +wildignore
+cursorshape     +localmap        +reltime         +wildmenu
+dialog_con_gui  +lua             +rightleft       +windows
+diff            +menu            -ruby            +writebackup
+digraphs        +mksession       +scrollbind      +X11
+dnd             +modify_fname    +signs           -xfontset
-ebcdic          +mouse           +smartindent     +xim
+emacs_tags      +mouseshape      +startuptime     +xpm
+eval            +mouse_dec       +statusline      +xsmp_interact
+ex_extra        +mouse_gpm       -sun_workshop    +xterm_clipboard
+extra_search    -mouse_jsbterm   +syntax          -xterm_save
+farsi           +mouse_netterm   +tag_binary

OSの種類/ディストリ/バージョン

  • Linux Kubuntu 16.04 64bit

使用している or 関係していそうなプラグイン

https://github.com/mattn/vim-fz

その他

端末上のVimでだけ発生し、GVimでは発生しませんでした。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 4, 2017

Member

8.0.1052 で試しましたが再現しませんでした。vim8 で動かなくなってたので先程ちょっと vim-fz を直しましたが、直接は関係ないと思います。

Member

mattn commented Sep 4, 2017

8.0.1052 で試しましたが再現しませんでした。vim8 で動かなくなってたので先程ちょっと vim-fz を直しましたが、直接は関係ないと思います。

@miyakogi

This comment has been minimized.

Show comment
Hide comment
@miyakogi

miyakogi Sep 4, 2017

修正後のvim-fzで発生しないのを確認しました。
git checkout HEAD^するとまた発生したので、その修正で直っているようです。

miyakogi commented Sep 4, 2017

修正後のvim-fzで発生しないのを確認しました。
git checkout HEAD^するとまた発生したので、その修正で直っているようです。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 4, 2017

Member

確認ありがとうございます。修正したのは bash の引数の与え方です。

mattn/vim-fz@0aa30d2

vim からするとどんな引数でも落ちるのは良く無いので、前の引数の与え方が何かクラッシュを引き起こすのだと思います。vim のバグである事は違いないのでこのままオープンしたまま直します。

後で可能性を調べてみます。

Member

mattn commented Sep 4, 2017

確認ありがとうございます。修正したのは bash の引数の与え方です。

mattn/vim-fz@0aa30d2

vim からするとどんな引数でも落ちるのは良く無いので、前の引数の与え方が何かクラッシュを引き起こすのだと思います。vim のバグである事は違いないのでこのままオープンしたまま直します。

後で可能性を調べてみます。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 4, 2017

Member

1回だけ再現したんですが、その後再現しなくなってしまった。もう200回くらい起動してるのに...

Member

mattn commented Sep 4, 2017

1回だけ再現したんですが、その後再現しなくなってしまった。もう200回くらい起動してるのに...

@k-takata k-takata added the kind/bug label Sep 6, 2017

@norio13

This comment has been minimized.

Show comment
Hide comment
@norio13

norio13 Sep 10, 2017

xfce4-terminal 0.8.3-1 / vim 8.0.1086(Huge 版 without GUI) / Debian 9 stretch 64bit
この環境で再現しました。

バックトレース

Program received signal SIGSEGV, Segmentation fault.
0x0000558f3c6f5e8a in bt_terminal (buf=0x7fae4799f1b8 <main_arena+1720>) at buffer.c:5744
5744        return buf != NULL && buf->b_p_bt[0] == 't';
(gdb) bt
#0  0x0000558f3c6f5e8a in bt_terminal (buf=0x7fae4799f1b8 <main_arena+1720>) at buffer.c:5744
#1  0x0000558f3c8567a4 in fillchar_status (attr=0x7ffcc69513fc, wp=0x558f3e794100) at screen.c:10753
#2  0x0000558f3c84fa25 in win_redr_status (wp=0x558f3e794100) at screen.c:6876
#3  0x0000558f3c843bb9 in update_screen (type_arg=0) at screen.c:783
#4  0x0000558f3c8ed3c7 in main_loop (cmdwin=0, noexmode=0) at main.c:1257
#5  0x0000558f3c8ecde3 in vim_main2 () at main.c:910
#6  0x0000558f3c8ec539 in main (argc=4, argv=0x7ffcc69516a8) at main.c:419

SEGVした時のbufとbuf->b_p_btの値

(gdb) p buf
$1 = (buf_T *) 0x7fae4799f1b8 <main_arena+1720>
(gdb) p buf->b_p_bt
$2 = (char_u *) 0x0
(gdb) p buf->b_p_bt[0]
Cannot access memory at address 0x0
(gdb) p &buf->b_p_bt
$3 = (char_u **) 0x7fae479a05b8 <intr+120>

vim-fzの11行目のexe a:ctx['buf'] 'bwipe!'をコメントアウトしたらSEGVしなくなりました。
https://github.com/mattn/vim-fz/blob/b5a21159fd68d2550af561935135b76f3ed42e96/autoload/fz.vim#L11
コールバックの中でbwipeoutを実行したらSEGVすると仮定して、vim-fzなしで再現するスクリプトを作りました。

サンプル1

sample.vim:

function! s:exit_cb(buf, job, st, ...)
    exe a:buf 'bwipe!'
endfunction

set lazyredraw
syntax on
set filetype=vim
call setline(1, ['echo 1'])
new
let buf = bufnr('')

let cmd = 'echo 1'
call term_start(cmd, {'curwin': buf, 'exit_cb': function('s:exit_cb', [buf])})

Vim起動その1:
高確率でSEGVしました。

vim -Nu sample.vim

Vim起動その2:
こちらの起動方法でもSEGVしましたが、再現率が低いです。

vim -Nu NONE -S sample.vim

Vim起動その3:

vim -Nu NONEで起動してから:so sample.vimを繰り返す

その3でSEGVした時のバックトレース

Program received signal SIGSEGV, Segmentation fault.
0x0000557865115e8a in bt_terminal (buf=0x55786697b870) at buffer.c:5744
5744        return buf != NULL && buf->b_p_bt[0] == 't';
(gdb) bt
#0  0x0000557865115e8a in bt_terminal (buf=0x55786697b870) at buffer.c:5744
#1  0x00005578652767a4 in fillchar_status (attr=0x7ffc8344896c, wp=0x5578668e7490) at screen.c:10753
#2  0x000055786526fa25 in win_redr_status (wp=0x5578668e7490) at screen.c:6876
#3  0x0000557865263bb9 in update_screen (type_arg=0) at screen.c:783
#4  0x00005578652c79a9 in terminal_loop () at terminal.c:1505
#5  0x000055786530d643 in main_loop (cmdwin=0, noexmode=0) at main.c:1366
#6  0x000055786530cde3 in vim_main2 () at main.c:910
#7  0x000055786530c539 in main (argc=3, argv=0x7ffc83448c58) at main.c:419

norio13 commented Sep 10, 2017

xfce4-terminal 0.8.3-1 / vim 8.0.1086(Huge 版 without GUI) / Debian 9 stretch 64bit
この環境で再現しました。

バックトレース

Program received signal SIGSEGV, Segmentation fault.
0x0000558f3c6f5e8a in bt_terminal (buf=0x7fae4799f1b8 <main_arena+1720>) at buffer.c:5744
5744        return buf != NULL && buf->b_p_bt[0] == 't';
(gdb) bt
#0  0x0000558f3c6f5e8a in bt_terminal (buf=0x7fae4799f1b8 <main_arena+1720>) at buffer.c:5744
#1  0x0000558f3c8567a4 in fillchar_status (attr=0x7ffcc69513fc, wp=0x558f3e794100) at screen.c:10753
#2  0x0000558f3c84fa25 in win_redr_status (wp=0x558f3e794100) at screen.c:6876
#3  0x0000558f3c843bb9 in update_screen (type_arg=0) at screen.c:783
#4  0x0000558f3c8ed3c7 in main_loop (cmdwin=0, noexmode=0) at main.c:1257
#5  0x0000558f3c8ecde3 in vim_main2 () at main.c:910
#6  0x0000558f3c8ec539 in main (argc=4, argv=0x7ffcc69516a8) at main.c:419

SEGVした時のbufとbuf->b_p_btの値

(gdb) p buf
$1 = (buf_T *) 0x7fae4799f1b8 <main_arena+1720>
(gdb) p buf->b_p_bt
$2 = (char_u *) 0x0
(gdb) p buf->b_p_bt[0]
Cannot access memory at address 0x0
(gdb) p &buf->b_p_bt
$3 = (char_u **) 0x7fae479a05b8 <intr+120>

vim-fzの11行目のexe a:ctx['buf'] 'bwipe!'をコメントアウトしたらSEGVしなくなりました。
https://github.com/mattn/vim-fz/blob/b5a21159fd68d2550af561935135b76f3ed42e96/autoload/fz.vim#L11
コールバックの中でbwipeoutを実行したらSEGVすると仮定して、vim-fzなしで再現するスクリプトを作りました。

サンプル1

sample.vim:

function! s:exit_cb(buf, job, st, ...)
    exe a:buf 'bwipe!'
endfunction

set lazyredraw
syntax on
set filetype=vim
call setline(1, ['echo 1'])
new
let buf = bufnr('')

let cmd = 'echo 1'
call term_start(cmd, {'curwin': buf, 'exit_cb': function('s:exit_cb', [buf])})

Vim起動その1:
高確率でSEGVしました。

vim -Nu sample.vim

Vim起動その2:
こちらの起動方法でもSEGVしましたが、再現率が低いです。

vim -Nu NONE -S sample.vim

Vim起動その3:

vim -Nu NONEで起動してから:so sample.vimを繰り返す

その3でSEGVした時のバックトレース

Program received signal SIGSEGV, Segmentation fault.
0x0000557865115e8a in bt_terminal (buf=0x55786697b870) at buffer.c:5744
5744        return buf != NULL && buf->b_p_bt[0] == 't';
(gdb) bt
#0  0x0000557865115e8a in bt_terminal (buf=0x55786697b870) at buffer.c:5744
#1  0x00005578652767a4 in fillchar_status (attr=0x7ffc8344896c, wp=0x5578668e7490) at screen.c:10753
#2  0x000055786526fa25 in win_redr_status (wp=0x5578668e7490) at screen.c:6876
#3  0x0000557865263bb9 in update_screen (type_arg=0) at screen.c:783
#4  0x00005578652c79a9 in terminal_loop () at terminal.c:1505
#5  0x000055786530d643 in main_loop (cmdwin=0, noexmode=0) at main.c:1366
#6  0x000055786530cde3 in vim_main2 () at main.c:910
#7  0x000055786530c539 in main (argc=3, argv=0x7ffc83448c58) at main.c:419
@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 10, 2017

Member
Member

mattn commented Sep 10, 2017

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 11, 2017

Member

ありがとうございました。頂いたサンプルでも再現しなかったのですが、以下のスクリプトで100%再現する様になりました。

function! s:exit_cb(buf, job, st, ...)
    exe a:buf 'bwipe!'
endfunction

set lazyredraw
new
syntax on
set filetype=vim
call setline(1, ['echo 1'])
new
let buf = bufnr('')

let cmd = 'echo 1'
call term_start(cmd, {'curwin': buf, 'exit_cb': function('s:exit_cb', [buf])})

ポイントは2回の new

Member

mattn commented Sep 11, 2017

ありがとうございました。頂いたサンプルでも再現しなかったのですが、以下のスクリプトで100%再現する様になりました。

function! s:exit_cb(buf, job, st, ...)
    exe a:buf 'bwipe!'
endfunction

set lazyredraw
new
syntax on
set filetype=vim
call setline(1, ['echo 1'])
new
let buf = bufnr('')

let cmd = 'echo 1'
call term_start(cmd, {'curwin': buf, 'exit_cb': function('s:exit_cb', [buf])})

ポイントは2回の new

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 11, 2017

Member

curbuf のポインタが壊れてるっぽい。

Member

mattn commented Sep 11, 2017

curbuf のポインタが壊れてるっぽい。

mattn added a commit to mattn/vim-fz that referenced this issue Sep 11, 2017

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 11, 2017

Member

vim-fz の方はワークアラウンド入れておきました。問題は vim 側。close_buffer 呼び出した後 curbuf のポインタがおかしい。なんかこのシリーズ何度も見た気がするしその都度直してもらった気がするけどなー。

Member

mattn commented Sep 11, 2017

vim-fz の方はワークアラウンド入れておきました。問題は vim 側。close_buffer 呼び出した後 curbuf のポインタがおかしい。なんかこのシリーズ何度も見た気がするしその都度直してもらった気がするけどなー。

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Sep 11, 2017

Member

@norio13 さんの Vim起動その1 で再現。Vim 8.0.1092 on Ubuntu 16.04

SEGV 発生時

Program received signal SIGSEGV, Segmentation fault.
0x00000000004f23a0 in curs_rows (wp=0x13a8a50) at move.c:680
680                             || wp->w_lines[0].wl_lnum > wp->w_topline);
(gdb) bt
#0  0x00000000004f23a0 in curs_rows (wp=0x13a8a50) at move.c:680
#1  0x00000000004f2d46 in curs_columns (may_scroll=1) at move.c:951
#2  0x00000000004f236f in validate_cursor () at move.c:642
#3  0x000000000061d53c in main_loop (cmdwin=0, noexmode=0) at main.c:1253
#4  0x000000000061cf6f in vim_main2 () at main.c:911
#5  0x000000000061c6f8 in main (argc=3, argv=0x7fffad7831a8) at main.c:420
(gdb) p curwin
$1 = (win_T *) 0x1136db0

curs_rows(curwin); で呼び出されるが、SEGV時には curwin が変わっている。

以下の箇所で curwin が変更される。

#0  win_close (win=0x13a8a50, free_buf=0) at window.c:2433
#1  0x000000000040821f in do_buffer (action=4, start=1, dir=1, count=2, forceit=1) at buffer.c:1476
#2  0x0000000000407b8f in do_bufdel (command=4, arg=0x1438ca8 "", addr_count=1, start_bnr=2, end_bnr=2, forceit=1) at buffer.c:1201
#3  0x0000000000477d5d in ex_bunload (eap=0x7fffad781410) at ex_docmd.c:5599
#4  0x0000000000472956 in do_one_cmd (cmdlinep=0x7fffad781630, sourcing=1, cstack=0x7fffad781720, fgetline=0x5eb0df <get_func_line>, cookie=0x13bccf0)
    at ex_docmd.c:2952
#5  0x000000000046f37e in do_cmdline (cmdline=0x1438c40 "2 bwipe!", fgetline=0x5eb0df <get_func_line>, cookie=0x13bccf0, flags=3) at ex_docmd.c:1089
#6  0x000000000043c1fa in ex_execute (eap=0x7fffad781d10) at eval.c:8369
#7  0x0000000000472956 in do_one_cmd (cmdlinep=0x7fffad781f30, sourcing=1, cstack=0x7fffad782020, fgetline=0x5eb0df <get_func_line>, cookie=0x13bccf0)
    at ex_docmd.c:2952
#8  0x000000000046f37e in do_cmdline (cmdline=0x0, fgetline=0x5eb0df <get_func_line>, cookie=0x13bccf0, flags=7) at ex_docmd.c:1089
#9  0x00000000005e5e43 in call_user_func (fp=0x1161150, argcount=3, argvars=0x7fffad782950, rettv=0x7fffad782b40, firstline=0, lastline=0, selfdict=0x0)
    at userfunc.c:942
#10 0x00000000005e6d3b in call_func (funcname=0x13beb80 "<SNR>1_exit_cb", len=14, rettv=0x7fffad782b40, argcount_in=2, argvars_in=0x7fffad782b50, argv_func=0x0,
    firstline=0, lastline=0, doesrange=0x7fffad782b3c, evaluate=1, partial=0x13beba0, selfdict_in=0x0) at userfunc.c:1427
#11 0x00000000006157ea in job_cleanup (job=0x13be000) at channel.c:5093
#12 0x0000000000615d61 in job_check_ended () at channel.c:5311
#13 0x00000000004f1456 in parse_queued_messages () at misc2.c:6347
#14 0x000000000052c3f0 in mch_inchar (buf=0x8b3316 <typebuf_init+54> "", maxlen=70, wtime=0, tb_change_cnt=1) at os_unix.c:419
#15 0x00000000005d8b00 in ui_inchar (buf=0x8b3316 <typebuf_init+54> "", maxlen=70, wtime=0, tb_change_cnt=1) at ui.c:195
#16 0x00000000004b1751 in inchar (buf=0x8b3316 <typebuf_init+54> "", maxlen=210, wait_time=0) at getchar.c:3067
#17 0x00000000004b1370 in vgetorpeek (advance=0) at getchar.c:2843
#18 0x00000000004afae7 in vpeekc () at getchar.c:1846
#19 0x00000000004afb93 in char_avail () at getchar.c:1902
#20 0x000000000057d400 in redrawing () at screen.c:10819
#21 0x00000000004f2383 in curs_rows (wp=0x13a8a50) at move.c:678
#22 0x00000000004f2d46 in curs_columns (may_scroll=1) at move.c:951
#23 0x00000000004f236f in validate_cursor () at move.c:642
#24 0x000000000061d53c in main_loop (cmdwin=0, noexmode=0) at main.c:1253
#25 0x000000000061cf6f in vim_main2 () at main.c:911
#26 0x000000000061c6f8 in main (argc=3, argv=0x7fffad7831a8) at main.c:420

redrawing()char_avail() 内で callback (bwipe) が実行されて curwin 等が変更される。

    int
redrawing(void)
{
#ifdef FEAT_EVAL
    if (disable_redraw_for_testing)
        return 0;
    else
#endif
        return (!RedrawingDisabled
                       && !(p_lz && char_avail() && !KeyTyped && !do_redraw));
}
Member

ichizok commented Sep 11, 2017

@norio13 さんの Vim起動その1 で再現。Vim 8.0.1092 on Ubuntu 16.04

SEGV 発生時

Program received signal SIGSEGV, Segmentation fault.
0x00000000004f23a0 in curs_rows (wp=0x13a8a50) at move.c:680
680                             || wp->w_lines[0].wl_lnum > wp->w_topline);
(gdb) bt
#0  0x00000000004f23a0 in curs_rows (wp=0x13a8a50) at move.c:680
#1  0x00000000004f2d46 in curs_columns (may_scroll=1) at move.c:951
#2  0x00000000004f236f in validate_cursor () at move.c:642
#3  0x000000000061d53c in main_loop (cmdwin=0, noexmode=0) at main.c:1253
#4  0x000000000061cf6f in vim_main2 () at main.c:911
#5  0x000000000061c6f8 in main (argc=3, argv=0x7fffad7831a8) at main.c:420
(gdb) p curwin
$1 = (win_T *) 0x1136db0

curs_rows(curwin); で呼び出されるが、SEGV時には curwin が変わっている。

以下の箇所で curwin が変更される。

#0  win_close (win=0x13a8a50, free_buf=0) at window.c:2433
#1  0x000000000040821f in do_buffer (action=4, start=1, dir=1, count=2, forceit=1) at buffer.c:1476
#2  0x0000000000407b8f in do_bufdel (command=4, arg=0x1438ca8 "", addr_count=1, start_bnr=2, end_bnr=2, forceit=1) at buffer.c:1201
#3  0x0000000000477d5d in ex_bunload (eap=0x7fffad781410) at ex_docmd.c:5599
#4  0x0000000000472956 in do_one_cmd (cmdlinep=0x7fffad781630, sourcing=1, cstack=0x7fffad781720, fgetline=0x5eb0df <get_func_line>, cookie=0x13bccf0)
    at ex_docmd.c:2952
#5  0x000000000046f37e in do_cmdline (cmdline=0x1438c40 "2 bwipe!", fgetline=0x5eb0df <get_func_line>, cookie=0x13bccf0, flags=3) at ex_docmd.c:1089
#6  0x000000000043c1fa in ex_execute (eap=0x7fffad781d10) at eval.c:8369
#7  0x0000000000472956 in do_one_cmd (cmdlinep=0x7fffad781f30, sourcing=1, cstack=0x7fffad782020, fgetline=0x5eb0df <get_func_line>, cookie=0x13bccf0)
    at ex_docmd.c:2952
#8  0x000000000046f37e in do_cmdline (cmdline=0x0, fgetline=0x5eb0df <get_func_line>, cookie=0x13bccf0, flags=7) at ex_docmd.c:1089
#9  0x00000000005e5e43 in call_user_func (fp=0x1161150, argcount=3, argvars=0x7fffad782950, rettv=0x7fffad782b40, firstline=0, lastline=0, selfdict=0x0)
    at userfunc.c:942
#10 0x00000000005e6d3b in call_func (funcname=0x13beb80 "<SNR>1_exit_cb", len=14, rettv=0x7fffad782b40, argcount_in=2, argvars_in=0x7fffad782b50, argv_func=0x0,
    firstline=0, lastline=0, doesrange=0x7fffad782b3c, evaluate=1, partial=0x13beba0, selfdict_in=0x0) at userfunc.c:1427
#11 0x00000000006157ea in job_cleanup (job=0x13be000) at channel.c:5093
#12 0x0000000000615d61 in job_check_ended () at channel.c:5311
#13 0x00000000004f1456 in parse_queued_messages () at misc2.c:6347
#14 0x000000000052c3f0 in mch_inchar (buf=0x8b3316 <typebuf_init+54> "", maxlen=70, wtime=0, tb_change_cnt=1) at os_unix.c:419
#15 0x00000000005d8b00 in ui_inchar (buf=0x8b3316 <typebuf_init+54> "", maxlen=70, wtime=0, tb_change_cnt=1) at ui.c:195
#16 0x00000000004b1751 in inchar (buf=0x8b3316 <typebuf_init+54> "", maxlen=210, wait_time=0) at getchar.c:3067
#17 0x00000000004b1370 in vgetorpeek (advance=0) at getchar.c:2843
#18 0x00000000004afae7 in vpeekc () at getchar.c:1846
#19 0x00000000004afb93 in char_avail () at getchar.c:1902
#20 0x000000000057d400 in redrawing () at screen.c:10819
#21 0x00000000004f2383 in curs_rows (wp=0x13a8a50) at move.c:678
#22 0x00000000004f2d46 in curs_columns (may_scroll=1) at move.c:951
#23 0x00000000004f236f in validate_cursor () at move.c:642
#24 0x000000000061d53c in main_loop (cmdwin=0, noexmode=0) at main.c:1253
#25 0x000000000061cf6f in vim_main2 () at main.c:911
#26 0x000000000061c6f8 in main (argc=3, argv=0x7fffad7831a8) at main.c:420

redrawing()char_avail() 内で callback (bwipe) が実行されて curwin 等が変更される。

    int
redrawing(void)
{
#ifdef FEAT_EVAL
    if (disable_redraw_for_testing)
        return 0;
    else
#endif
        return (!RedrawingDisabled
                       && !(p_lz && char_avail() && !KeyTyped && !do_redraw));
}
@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 11, 2017

Member

char_avail 凶悪っぽいw

Member

mattn commented Sep 11, 2017

char_avail 凶悪っぽいw

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Sep 11, 2017

Member

ですね。char_avail で状態変わるのは厄介すぎるので、ここでのcallbackは禁止したい
https://github.com/vim/vim/compare/master...ichizok:fix/dangerous-callback.diff

Member

ichizok commented Sep 11, 2017

ですね。char_avail で状態変わるのは厄介すぎるので、ここでのcallbackは禁止したい
https://github.com/vim/vim/compare/master...ichizok:fix/dangerous-callback.diff

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Sep 17, 2017

Member

投げました。
vim/vim#2107

Member

ichizok commented Sep 17, 2017

投げました。
vim/vim#2107

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 17, 2017

Member

今日はなんかテスト速いなー

Member

mattn commented Sep 17, 2017

今日はなんかテスト速いなー

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Sep 4, 2018

Member

vim/vim#2107 (comment)
vim/vim#2107 (comment)

8.1.342 で直ったという報告がありますが、私の環境ではまだSEGVします。(Ubuntu 18.04, macOS 10.13.6)
他の方はどうでしょうか?

vim -Nu sample.vim

以下の sample.vim で、起動直後または起動して何かキー入力をすると落ちます。

sample.vim:

" use only vim's runtime 
set rtp=/path/to/vim-8.1.0346/runtime

" disable each plugins (they are sourced but finish early)
let g:loaded_2html_plugin = 1
let g:loaded_getscriptPlugin = 1
let g:loaded_gzip = 1
let g:loaded_logiPat = 1
let g:loaded_matchparen = 1
let g:loaded_netrwPlugin = 1
let g:loaded_rrhelper = 1
let g:loaded_spellfile_plugin = 1
let g:loaded_tarPlugin = 1
let g:loaded_vimballPlugin = 1
let g:loaded_zipPlugin = 1

" sample.vim
function! s:exit_cb(buf, job, st, ...)
    exe a:buf 'bwipe!'
endfunction

set lazyredraw
syntax on
set filetype=vim
call setline(1, ['echo 1'])
new
let buf = bufnr('')

let cmd = 'echo 1'
call term_start(cmd, {'curwin': buf, 'exit_cb': function('s:exit_cb', [buf])})
Member

ichizok commented Sep 4, 2018

vim/vim#2107 (comment)
vim/vim#2107 (comment)

8.1.342 で直ったという報告がありますが、私の環境ではまだSEGVします。(Ubuntu 18.04, macOS 10.13.6)
他の方はどうでしょうか?

vim -Nu sample.vim

以下の sample.vim で、起動直後または起動して何かキー入力をすると落ちます。

sample.vim:

" use only vim's runtime 
set rtp=/path/to/vim-8.1.0346/runtime

" disable each plugins (they are sourced but finish early)
let g:loaded_2html_plugin = 1
let g:loaded_getscriptPlugin = 1
let g:loaded_gzip = 1
let g:loaded_logiPat = 1
let g:loaded_matchparen = 1
let g:loaded_netrwPlugin = 1
let g:loaded_rrhelper = 1
let g:loaded_spellfile_plugin = 1
let g:loaded_tarPlugin = 1
let g:loaded_vimballPlugin = 1
let g:loaded_zipPlugin = 1

" sample.vim
function! s:exit_cb(buf, job, st, ...)
    exe a:buf 'bwipe!'
endfunction

set lazyredraw
syntax on
set filetype=vim
call setline(1, ['echo 1'])
new
let buf = bufnr('')

let cmd = 'echo 1'
call term_start(cmd, {'curwin': buf, 'exit_cb': function('s:exit_cb', [buf])})
@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east Sep 4, 2018

Member

@ichizok
Vim 8.1.0347 on Fedora 28 via PuTTY で10回ほど試しましたが落ちませんでした。
configureも2種類試しましたが問題なし。

$ ./configure CFALGS='-ggdb3' --enable-gui=gnome2 --enable-autoservername --enable-fail-if-missing
$ ./configure --enable-gui=gnome2 --enable-autoservername --enable-fail-if-missing
Member

h-east commented Sep 4, 2018

@ichizok
Vim 8.1.0347 on Fedora 28 via PuTTY で10回ほど試しましたが落ちませんでした。
configureも2種類試しましたが問題なし。

$ ./configure CFALGS='-ggdb3' --enable-gui=gnome2 --enable-autoservername --enable-fail-if-missing
$ ./configure --enable-gui=gnome2 --enable-autoservername --enable-fail-if-missing
@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Sep 4, 2018

Member

@h-east 検証ありがとうございます。
src/Makefile の SANITIZER_CFLAGS を有効にしてビルドしたバイナリだとどうでしょうか?

/path/to/vim -Nu sample.vim -i NONE 2> asan.log

Member

ichizok commented Sep 4, 2018

@h-east 検証ありがとうございます。
src/Makefile の SANITIZER_CFLAGS を有効にしてビルドしたバイナリだとどうでしょうか?

/path/to/vim -Nu sample.vim -i NONE 2> asan.log

@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east Sep 4, 2018

Member

@ichizok 同様に10回ほど実施しましたが落ちませんでした。
PS
libasan ってインストールが必要だったんですね。 sudo dnf install libasan

Member

h-east commented Sep 4, 2018

@ichizok 同様に10回ほど実施しましたが落ちませんでした。
PS
libasan ってインストールが必要だったんですね。 sudo dnf install libasan

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Sep 4, 2018

Member

@h-east ありがとうございます。
私の環境に何か問題あるのだろうか。

Member

ichizok commented Sep 4, 2018

@h-east ありがとうございます。
私の環境に何か問題あるのだろうか。

@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east Sep 5, 2018

Member

patch(8.1.0342)前のやつ(8.1.0341) on Ubuntu 18.04 前でもなかなか起きないですね。

$ ./vim --clean -S ~/sample.vim 2>asan.log

で10回に1回くらい最下行にステータスラインが変に表示される感じです。
bad_stl

70回くらいやってやっとSEGVじゃないですがASANがエラーを出しました。


8.1.0346 on Ubuntu 18.04 で150回ほど上記コマンドを試しましたがステータスラインが変になることもないし、ASANエラーも1度も出ませんでした。
うーん、なんでしょうね。

Member

h-east commented Sep 5, 2018

patch(8.1.0342)前のやつ(8.1.0341) on Ubuntu 18.04 前でもなかなか起きないですね。

$ ./vim --clean -S ~/sample.vim 2>asan.log

で10回に1回くらい最下行にステータスラインが変に表示される感じです。
bad_stl

70回くらいやってやっとSEGVじゃないですがASANがエラーを出しました。


8.1.0346 on Ubuntu 18.04 で150回ほど上記コマンドを試しましたがステータスラインが変になることもないし、ASANエラーも1度も出ませんでした。
うーん、なんでしょうね。

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Sep 5, 2018

Member

sample.vim を更新してみました。

sample.vim:

set rtp=

function! ExitCb(job, status)
  exe g:buf 'bw!'
endfunction

set cursorline lazyredraw
new
let g:buf = bufnr('')

call job_start(['true'], {'exit_cb': 'ExitCb'})
call feedkeys(repeat('g', 1000) . 'o', 'nt')
$ vim --clean -Nu sample.vim --noplugin

or

$ vim --clean -Nu NONE -S sample.vim

で実行してみてください。

私の環境 (Ubuntu 18.04) では、以下の手順でビルドした vim が起動直後に SEGV することを確認しています。
(SANITIZER_CFLAGS を有効にした場合は abort)

$ git clone --depth 1 https://github.com/vim/vim
$ cd vim
$ env CFLAGS='-ggdb3 -O0' ./configure
$ make
Member

ichizok commented Sep 5, 2018

sample.vim を更新してみました。

sample.vim:

set rtp=

function! ExitCb(job, status)
  exe g:buf 'bw!'
endfunction

set cursorline lazyredraw
new
let g:buf = bufnr('')

call job_start(['true'], {'exit_cb': 'ExitCb'})
call feedkeys(repeat('g', 1000) . 'o', 'nt')
$ vim --clean -Nu sample.vim --noplugin

or

$ vim --clean -Nu NONE -S sample.vim

で実行してみてください。

私の環境 (Ubuntu 18.04) では、以下の手順でビルドした vim が起動直後に SEGV することを確認しています。
(SANITIZER_CFLAGS を有効にした場合は abort)

$ git clone --depth 1 https://github.com/vim/vim
$ cd vim
$ env CFLAGS='-ggdb3 -O0' ./configure
$ make
@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east Sep 5, 2018

Member

起きました!
vim/src へ移動して実行すると起きないんですが、
cd srcせずに src/vim --clean -Nu ~/sample.vim --nopluginすると100%発生しますね。

違いが分かってよかった👏

Member

h-east commented Sep 5, 2018

起きました!
vim/src へ移動して実行すると起きないんですが、
cd srcせずに src/vim --clean -Nu ~/sample.vim --nopluginすると100%発生しますね。

違いが分かってよかった👏

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Sep 5, 2018

Member

検証ありがとうございます。このsampleで再報告してみます。

Member

ichizok commented Sep 5, 2018

検証ありがとうございます。このsampleで再報告してみます。

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Sep 7, 2018

Member

8.1.0349 で修正されました。(Bram による patch)
vim/vim@ed5a9d6

Member

ichizok commented Sep 7, 2018

8.1.0349 で修正されました。(Bram による patch)
vim/vim@ed5a9d6

@ichizok ichizok closed this Sep 7, 2018

@ichizok ichizok added the xlose/fixed label Sep 7, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment