blink.cmp icon indicating copy to clipboard operation
blink.cmp copied to clipboard

Fuzzy Rust implementation crashes neovim on insert text

Open ignamartinoli opened this issue 4 months ago • 3 comments

Make sure you have done the following

  • [x] Updated to the latest version of blink.cmp
  • [x] Searched for existing issues and documentation (try <C-k> on https://cmp.saghen.dev)

Bug Description

Related to this issue: github.com/neovim/neovim/issues/35384

When inserting text, Neovim would crash with backtrace:

❯ gdb -q /home/sicro/neovim/build/bin/nvim /home/sicro/neovim/build/bin/core
Reading symbols from /home/sicro/neovim/build/bin/nvim...

warning: Can't open file anon_inode:[io_uring] during file-backed mapping note processing
[New LWP 24931]
[New LWP 25031]
[New LWP 25028]
[New LWP 25030]
[New LWP 25029]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib64/libthread_db.so.1".
Core was generated by `/home/sicro/neovim/build/bin/nvim --embed'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00007ffff7ca9380 in ?? ()
[Current thread is 1 (Thread 0x7ffff7cc9780 (LWP 24931))]
(gdb) thread apply all bt full

Thread 5 (Thread 0x7ffff617e6c0 (LWP 25029)):
#0  0x00007ffff7d921ee in ?? () from /usr/lib64/libc.so.6
No symbol table info available.
#1  0x00007ffff7d86d9b in ?? () from /usr/lib64/libc.so.6
No symbol table info available.
#2  0x00007ffff7d873cc in ?? () from /usr/lib64/libc.so.6
No symbol table info available.
#3  0x00007ffff7d8993a in pthread_cond_wait () from /usr/lib64/libc.so.6
No symbol table info available.
#4  0x0000555555a49539 in uv_cond_wait ()
No symbol table info available.
#5  0x0000555555a36a5a in worker ()
No symbol table info available.
#6  0x00007ffff7d8a328 in ?? () from /usr/lib64/libc.so.6
No symbol table info available.
#7  0x00007ffff7df8708 in ?? () from /usr/lib64/libc.so.6
No symbol table info available.

Thread 4 (Thread 0x7ffff597d6c0 (LWP 25030)):
#0  0x00007ffff7d921ee in ?? () from /usr/lib64/libc.so.6
No symbol table info available.
#1  0x00007ffff7d86d9b in ?? () from /usr/lib64/libc.so.6
No symbol table info available.
#2  0x00007ffff7d873cc in ?? () from /usr/lib64/libc.so.6
No symbol table info available.
#3  0x00007ffff7d8993a in pthread_cond_wait () from /usr/lib64/libc.so.6
No symbol table info available.
#4  0x0000555555a49539 in uv_cond_wait ()
No symbol table info available.
#5  0x0000555555a36a5a in worker ()
No symbol table info available.
#6  0x00007ffff7d8a328 in ?? () from /usr/lib64/libc.so.6
No symbol table info available.
#7  0x00007ffff7df8708 in ?? () from /usr/lib64/libc.so.6
No symbol table info available.

Thread 3 (Thread 0x7ffff697f6c0 (LWP 25028)):
#0  0x00007ffff7d921ee in ?? () from /usr/lib64/libc.so.6
--Type <RET> for more, q to quit, c to continue without paging--
No symbol table info available.
#1  0x00007ffff7d86d9b in ?? () from /usr/lib64/libc.so.6
No symbol table info available.
#2  0x00007ffff7d873cc in ?? () from /usr/lib64/libc.so.6
No symbol table info available.
#3  0x00007ffff7d8993a in pthread_cond_wait () from /usr/lib64/libc.so.6
No symbol table info available.
#4  0x0000555555a49539 in uv_cond_wait ()
No symbol table info available.
#5  0x0000555555a36a5a in worker ()
No symbol table info available.
#6  0x00007ffff7d8a328 in ?? () from /usr/lib64/libc.so.6
No symbol table info available.
#7  0x00007ffff7df8708 in ?? () from /usr/lib64/libc.so.6
No symbol table info available.

Thread 2 (Thread 0x7ffff517c6c0 (LWP 25031)):
#0  0x00007ffff7d921ee in ?? () from /usr/lib64/libc.so.6
No symbol table info available.
#1  0x00007ffff7d86d9b in ?? () from /usr/lib64/libc.so.6
No symbol table info available.
#2  0x00007ffff7d873cc in ?? () from /usr/lib64/libc.so.6
No symbol table info available.
#3  0x00007ffff7d8993a in pthread_cond_wait () from /usr/lib64/libc.so.6
No symbol table info available.
#4  0x0000555555a49539 in uv_cond_wait ()
No symbol table info available.
#5  0x0000555555a36a5a in worker ()
No symbol table info available.
#6  0x00007ffff7d8a328 in ?? () from /usr/lib64/libc.so.6
No symbol table info available.
#7  0x00007ffff7df8708 in ?? () from /usr/lib64/libc.so.6
No symbol table info available.

Thread 1 (Thread 0x7ffff7cc9780 (LWP 24931)):
#0  0x00007ffff7ca9380 in ?? ()
No symbol table info available.
#1  0x00007ffff46cca4f in ?? () from /home/sicro/.local/share/nvim/lazy/blink.cmp/lua/blink/cmp/fuzzy/rust/../../../../../target/release/libblink_cmp_fuzzy.so
--Type <RET> for more, q to quit, c to continue without paging--
No symbol table info available.
#2  0x00007ffff46cc741 in ?? () from /home/sicro/.local/share/nvim/lazy/blink.cmp/lua/blink/cmp/fuzzy/rust/../../../../../target/release/libblink_cmp_fuzzy.so
No symbol table info available.
#3  0x00007ffff46a7106 in ?? () from /home/sicro/.local/share/nvim/lazy/blink.cmp/lua/blink/cmp/fuzzy/rust/../../../../../target/release/libblink_cmp_fuzzy.so
No symbol table info available.
#4  0x00007ffff7eda900 in _Unwind_RaiseException () from /usr/lib/gcc/x86_64-pc-linux-gnu/15/libgcc_s.so.1
No symbol table info available.
#5  0x00005555559c8b25 in err_raise_ext (g=0x7ffff7ca93e0, errcode=<optimized out>) at lj_err.c:758
No locals.
#6  lj_err_throw (L=0x7ffff7ca9380, errcode=errcode@entry=2) at lj_err.c:774
        g = 0x7ffff7ca93e0
#7  0x00005555559c8f3a in lj_err_run (L=<optimized out>) at lj_err.c:899
        ef = <optimized out>
#8  0x00005555559c9799 in lua_error (L=<optimized out>) at lj_err.c:1121
No locals.
#9  0x00007ffff4676738 in ?? () from /home/sicro/.local/share/nvim/lazy/blink.cmp/lua/blink/cmp/fuzzy/rust/../../../../../target/release/libblink_cmp_fuzzy.so
No symbol table info available.
#10 0x00007ffff466fcb1 in ?? () from /home/sicro/.local/share/nvim/lazy/blink.cmp/lua/blink/cmp/fuzzy/rust/../../../../../target/release/libblink_cmp_fuzzy.so
No symbol table info available.
#11 0x00005555559e9a36 in lj_BC_FUNCC ()
No symbol table info available.
#12 0x00005555559d4e11 in lua_pcall (L=L@entry=0x7ffff7ca9380, nargs=nargs@entry=0, nresults=nresults@entry=0, errfunc=errfunc@entry=-2) at lj_api.c:1122
        g = 0x7ffff7ca93e0
        oldh = <optimized out>
        ef = <optimized out>
        status = <optimized out>
        __func__ = "lua_pcall"
#13 0x00005555557a61a1 in nlua_pcall (lstate=lstate@entry=0x7ffff7ca9380, nargs=nargs@entry=0, nresults=nresults@entry=0) at /home/sicro/neovim/src/nvim/lua/executor.c:179
        pre_top = 2
        status = <optimized out>
#14 0x00005555557abe61 in nlua_schedule_event (argv=<optimized out>) at /home/sicro/neovim/src/nvim/lua/executor.c:381
        cb = <optimized out>
        ns_id = 0
--Type <RET> for more, q to quit, c to continue without paging--
        lstate = 0x7ffff7ca9380
#15 0x00005555558d94f6 in state_handle_k_event () at /home/sicro/neovim/src/nvim/state.c:118
        event = {handler = 0x5555557abe10 <nlua_schedule_event>, argv = {0x475, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}
#16 0x0000555555699805 in insert_handle_key (s=<optimized out>) at /home/sicro/neovim/src/nvim/edit.c:937
No locals.
#17 insert_execute (state=0x7fffffffbd00, key=<optimized out>) at /home/sicro/neovim/src/nvim/edit.c:709
        s = 0x7fffffffbd00
#18 0x00005555558d93d2 in state_enter (s=0x7fffffffbd00) at /home/sicro/neovim/src/nvim/state.c:100
        check_result = <optimized out>
        key = <optimized out>
        execute_result = <optimized out>
        getkey = <optimized out>
#19 0x000055555569b489 in insert_enter (s=0x7fffffffbd00) at /home/sicro/neovim/src/nvim/edit.c:340
        inserted = <optimized out>
#20 edit (cmdchar=<optimized out>, startln=<optimized out>, count=<optimized out>) at /home/sicro/neovim/src/nvim/edit.c:1336
        s = {{state = {check = 0x555555696920 <insert_check>, execute = 0x555555698180 <insert_execute>}, ca = 0x0, mincol = 0, cmdchar = 105, cmdchar_todo = 105, startln = 0, count = 0, c = -26365, lastc = 97, i = 0, did_backspace = false, line_is_white = false, old_topline = 1, old_topfill = 0, inserted_space = 0, replaceState = 272, did_restart_edit = 0, nomove = false}}
#21 0x000055555580a672 in normal_finish_command (s=<optimized out>) at /home/sicro/neovim/src/nvim/normal.c:1055
        prev_finish_op = <optimized out>
#22 normal_execute (state=0x7fffffffbe10, key=<optimized out>) at /home/sicro/neovim/src/nvim/normal.c:1247
        s = 0x7fffffffbe10
        __PRETTY_FUNCTION__ = "normal_execute"
#23 0x00005555558d9410 in state_enter (s=0x7fffffffbe10) at /home/sicro/neovim/src/nvim/state.c:100
        check_result = <optimized out>
        key = <optimized out>
        execute_result = <optimized out>
        getkey = <optimized out>
#24 0x0000555555806c51 in normal_enter (cmdwin=<optimized out>, noexmode=<optimized out>) at /home/sicro/neovim/src/nvim/normal.c:521
        state = {state = {check = 0x5555558081d0 <normal_check>, execute = 0x555555808b20 <normal_execute>}, command_finished = false, ctrl_w = false,need_flushbuf = false, set_prevcount = false, previous_got_int = false, cmdwin = false, noexmode = false, toplevel = true, oa = {op_type = 0, regname = 0, motion_type = kMTCharWise, motion_force = 0, use_reg_one = false, inclusive = false, end_adjusted = false, start = {lnum = 0, col = 0, coladd = 0}, end = {lnum = 0, col = 0, coladd = 0}, cursor_start = {lnum = 0, col = 0, coladd = 0}, line_count = 0, empty = false, is_VIsual = false, start_vcol =0, end_vcol = 0, prev_opcount = 0, prev_count0 = 0, excl_tr_ws = false}, ca = {oap = 0x7fffffffbe28, prechar = 0, cmdchar = -26621, nchar = 0, nchar_composing = '\000' <repeats 31 times>, nchar_len = 0, extra_char = 0, opcount = 0, count0 = 0, count1 = 1, arg = 0, retval = 0, searchbuf = 0x0}, mapped_len = 0, old_mapped_len = 0, idx = 187, c = -26621, old_col = 48, old_pos = {lnum = 15, col = 50, coladd = 0}}
        prev_oap = 0x0
#25 0x00005555555fb1aa in main (argc=<optimized out>, argv=<optimized out>) at /home/sicro/neovim/src/nvim/main.c:654
        fname = <optimized out>
--Type <RET> for more, q to quit, c to continue without paging--
        params = {argc = 2, argv = 0x7fffffffc378, use_vimrc = 0x0, clean = false, n_commands = 0, commands = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,0x0, 0x0}, cmds_tofree = "\000\000\000\000\000\000\000\000\000", n_pre_commands = 0, pre_commands = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, luaf = 0x0, lua_arg0 = -1, edit_type = 0, tagname = 0x0, use_ef = 0x0, input_istext = false, no_swap_file = 0, use_debug_break_level = -1, window_count = 1, window_layout = 0, diff_mode = 0, listen_addr = 0x0, remote = 0, server_addr = 0x0, scriptin = 0x0, scriptout = 0x0, scriptout_append = false, had_stdin_file = false}
        cwd = 0x0
        has_term = <optimized out>
        use_builtin_ui = <optimized out>
        remote_ui = <optimized out>
        use_remote_ui = <optimized out>
        listen_and_embed = <optimized out>
        vimrc_none = <optimized out>
        __PRETTY_FUNCTION__ = "main"

The trigger for the issue is having blink.cmp installed with the Rust fuzzy implementation.

As suggested by Justin under that Issue, it's very likely an issue in the FFI usage.

Relevant configuration

fuzzy = {
	implementation = 'rust'
},

neovim version

NVIM v0.11.3 Build type: Release LuaJIT 2.1.1731601260

blink.cmp version

main

ignamartinoli avatar Sep 16 '25 18:09 ignamartinoli

Have you tested this since #2136 was merged?

saghen avatar Sep 17 '25 19:09 saghen

@Saghen This is the current state of the plugin:

version 1.7.0  
tag     v1.7.0 
branch  main   
commit  327fff9

ignamartinoli avatar Sep 17 '25 22:09 ignamartinoli

I can confirm this happens on 0.11.4 aswell

a-usr avatar Oct 27 '25 10:10 a-usr