martanne / vis

A vi-like editor based on Plan 9's structural regular expressions
Other
4.19k stars 259 forks source link

vis:command('open ' .. rejfile) with some chars in rejfile leads to crash #1055

Closed mcepl closed 1 year ago

mcepl commented 1 year ago

This is my plugin:

local function file_exists(path)
    local f <close> = io.open(path)
    return f ~= nil
end

local function open_rej_file(file)
    if file then
        local rejfile = file .. '.rej'
        if file_exists(rejfile) then
            vis:command('open ' .. rejfile)
        end
    end
end

vis.events.subscribe(vis.events.FILE_OPEN, function (file)
    open_rej_file(file.path)
end)

When the current file is /home/matej/build/devel:languages:lua/luajit/luajit-2.1.0~beta3+git.1669107176.46aa45d/Makefile (notice the tilda character) and Makefile.rej exists, then vis crashes with this backtrace:

Program received signal SIGSEGV, Segmentation fault.
                                                    file_open_dialog (vis=0x5555555b7cb0, pattern=0x555555658370 "/home/matej/build/devel:languages:lua/luajit/luajit-2.1.0~beta3+git.1669107176.46aa45d/Makefile.rej") at /usr/src/debug/vis/vis-cmds.c:405
405     int status = vis_pipe(vis, vis->win->file, &empty,
(gdb) t a a bt

Thread 1 (Thread 0x7ffff7af1f00 (LWP 8971) "vis"):
#0  file_open_dialog (vis=0x5555555b7cb0, pattern=0x555555658370 "/home/matej/build/devel:languages:lua/luajit/luajit-2.1.0~beta3+git.1669107176.46aa45d/Makefile.rej") at /usr/src/debug/vis/vis-cmds.c:405
#1  0x000055555557086c in openfiles (vis=0x5555555b7cb0, files=0x555555744138) at /usr/src/debug/vis/vis-cmds.c:426
#2  0x0000555555570987 in cmd_open (vis=0x5555555b7cb0, win=0x0, cmd=0x555555744130, argv=0x555555744130, sel=0x0, range=0x7fffffffc150) at /usr/src/debug/vis/vis-cmds.c:442
#3  0x000055555556c210 in sam_execute (vis=0x5555555b7cb0, win=0x0, cmd=0x555555744130, sel=0x0, range=0x7fffffffc150) at /usr/src/debug/vis/sam.c:1139
#4  0x000055555556d8be in cmd_select (vis=0x5555555b7cb0, win=0x0, cmd=0x5555557441c0, argv=0x5555557441c0, sel=0x0, range=0x7fffffffc250) at /usr/src/debug/vis/sam.c:1490
#5  0x000055555556c210 in sam_execute (vis=0x5555555b7cb0, win=0x0, cmd=0x5555557441c0, sel=0x0, range=0x7fffffffc250) at /usr/src/debug/vis/sam.c:1139
#6  0x000055555556c69d in sam_cmd (vis=0x5555555b7cb0, s=0x5555556b1100 "open /home/matej/build/devel:languages:lua/luajit/luajit-2.1.0~beta3+git.1669107176.46aa45d/Makefile.rej") at /usr/src/debug/vis/sam.c:1219
#7  0x000055555558ce55 in vis_cmd (vis=0x5555555b7cb0, cmdline=0x5555557236e8 "open /home/matej/build/devel:languages:lua/luajit/luajit-2.1.0~beta3+git.1669107176.46aa45d/Makefile.rej") at /usr/src/debug/vis/vis.c:1996
#8  0x000055555558f1c5 in command (L=0x5555555dd088) at /usr/src/debug/vis/vis-lua.c:763
#9  0x00007ffff7ead6de in precallC (f=0x55555558f161 <command>, nresults=0, func=0x55555577ad40, L=0x5555555dd088) at /usr/src/debug/lua54-5.4.4-6.1.x86_64/src/ldo.c:507
#10 luaD_precall (L=0x5555555dd088, func=<optimized out>, nresults=0) at /usr/src/debug/lua54-5.4.4-6.1.x86_64/src/ldo.c:573
#11 0x00007ffff7eb9651 in luaV_execute (L=<optimized out>, ci=<optimized out>) at /usr/src/debug/lua54-5.4.4-6.1.x86_64/src/lvm.c:1638
#12 0x00007ffff7eadcd2 in ccall (inc=65537, nResults=<optimized out>, func=<optimized out>, L=0x5555555dd088) at /usr/src/debug/lua54-5.4.4-6.1.x86_64/src/ldo.c:610
#13 luaD_callnoyield (nResults=<optimized out>, func=<optimized out>, L=0x5555555dd088) at /usr/src/debug/lua54-5.4.4-6.1.x86_64/src/ldo.c:628
#14 f_call (L=L@entry=0x5555555dd088, ud=ud@entry=0x7fffffffc5c0) at /usr/src/debug/lua54-5.4.4-6.1.x86_64/src/lapi.c:1040
#15 0x00007ffff7ea888b in luaD_rawrunprotected (L=L@entry=0x5555555dd088, f=f@entry=0x7ffff7eadc90 <f_call>, ud=ud@entry=0x7fffffffc5c0) at /usr/src/debug/lua54-5.4.4-6.1.x86_64/src/ldo.c:144
#16 0x00007ffff7eaaec0 in luaD_pcall (L=L@entry=0x5555555dd088, func=func@entry=0x7ffff7eadc90 <f_call>, u=u@entry=0x7fffffffc5c0, old_top=256, ef=<optimized out>) at /usr/src/debug/lua54-5.4.4-6.1.x86_64/src/ldo.c:926
#17 0x00007ffff7eadd9c in lua_pcallk (L=0x5555555dd088, nargs=<optimized out>, nresults=0, errfunc=<optimized out>, ctx=0, k=<optimized out>) at /usr/src/debug/lua54-5.4.4-6.1.x86_64/src/lapi.c:1066
#18 0x000055555558db7c in pcall (vis=0x5555555b7cb0, L=0x5555555dd088, nargs=1, nresults=0) at /usr/src/debug/vis/vis-lua.c:274
#19 0x0000555555594c54 in vis_lua_file_open (vis=0x5555555b7cb0, file=0x5555555d0450) at /usr/src/debug/vis/vis-lua.c:3020
#20 0x00005555555850a1 in vis_event_emit (vis=0x5555555b7cb0, id=VIS_EVENT_FILE_OPEN) at /usr/src/debug/vis/vis.c:69
#21 0x0000555555585c50 in file_new (vis=0x5555555b7cb0, name=0x7fffffffe14b "Makefile") at /usr/src/debug/vis/vis.c:224
#22 0x0000555555587675 in vis_window_new (vis=0x5555555b7cb0, filename=0x7fffffffe14b "Makefile") at /usr/src/debug/vis/vis.c:604
#23 0x0000555555568bbc in main (argc=2, argv=0x7fffffffdbf8) at /usr/src/debug/vis/main.c:2334

Looking at Open Group specification filename may consists from any characters except of the slash character, and looking at the backtrace, it seems that the filename got to the function file_open_dialog unmangled.

Crashed was supposed to happen in https://github.com/martanne/vis/blob/593a70b1eb136c1bb655db3bf08c29f5f9f2165f/vis-cmds.c#L405-L407

mcepl commented 1 year ago

Moved to https://todo.sr.ht/~martanne/vis/8.