| Commit message (Collapse) | Author | Age | ||
|---|---|---|---|---|
| ... | ||||
| * | | | minor: tui: update_attrs: code consistency | Daniel Hahler | 2018-09-23 | |
| |/ / | ||||
| * | | TUI: Reset cursor color when applicable #8572 | Yichao Zhou | 2018-09-22 | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Resets the TUI cursor color if: - current 'guicursor' mode does not specify a highlight group - cursor highlight group has "inverse" or "reverse" flag - on Nvim exit We interpret, "inverse" to mean "default cursor". Example: hi Cursor guifg=bg guibg=fg set termguicolors set guicursor=n-v-c-sm:block,i-ci-ve:ver25-Cursor,r-cr-o:hor20 * When the cursor shape is block, its color will be "inverse" * When the cursor shape is I-beam, its color will be `hi Cursor`. This is useful e.g. to prevent `set listchars=eol:¬` causing your cursor color to a low contrast color in insert mode because you cursor are often at EOL in insert mode. close #8572 | |||
| * | | cleanup/TUI: remove old unused code #9013 | Justin M. Keyes | 2018-09-19 | |
| | | | | | | | | | | | | | | | | | - Checks for ECHOE, ICANON were left over from Vim code. We already reference the symbols elsewhere without checking. - newline_on_exit, intr_char: Both are vestigial remnants of Vim 4.x, not implemented in Nvim. intr_char is a termios/stty feature, it's probably not useful because users have other ways to configure their terminals. | |||
| * | | TUI: Skip redundant "stop" event (macOS kernel panic) (#9007) | Justin M. Keyes | 2018-09-18 | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When the TUI suspends (:suspend, CTRL-z) it calls tui_terminal_stop (but does NOT set `ui->data=NULL`, so `tui_is_stopped` returns false). If the host terminal dies, it sends SIGCONT, SIGHUP (usually in that order): ERROR 2018-09-16T19:30:17.065 25821 suspend_event:1153: SIGCONT ERROR 2018-09-16T19:30:17.065 25821 on_signal:162: SIGHUP ERROR 2018-09-16T19:30:17.155 25821 on_signal:162: SIGHUP Race: if SIGHUP is handled before SIGCONT, it calls ui_builtin_stop() which schedules tui_stop before the TUI was resumed? libuv uv_close() aborts if the handle is already closed/closing. Somehow that causes macOS to panic. #8075 Assertion failed: (!uv__is_closing(handle)), function uv_close, file src/unix/core.c, line 117. Thread 0:: Dispatch queue: com.apple.main-thread 0 libsystem_kernel.dylib 0x00007fff67d69ec2 kevent + 10 1 libuv.1.dylib 0x000000010609304d uv__io_poll + 892 2 libuv.1.dylib 0x0000000106083904 uv_run + 339 3 nvim 0x0000000105e76f7b loop_poll_events + 74 4 nvim 0x0000000105fa5f51 ui_bridge_stop + 206 5 nvim 0x0000000105fa4c00 ui_builtin_stop + 50 6 nvim 0x0000000105f26ee9 mch_exit + 29 7 nvim 0x0000000105eda84a getout + 518 8 nvim 0x0000000105e778b3 multiqueue_process_events + 77 9 nvim 0x0000000105f24c5a os_breakcheck + 49 10 nvim 0x0000000105eb7ea3 auto_next_pat + 463 11 nvim 0x0000000105eb7603 apply_autocmds_group + 1289 12 nvim 0x0000000105eb0e8d apply_autocmds + 36 13 nvim 0x0000000105f5a412 screenalloc + 1892 14 nvim 0x0000000105f5b223 screen_resize + 190 15 nvim 0x0000000105fa52e3 ui_refresh + 257 16 nvim 0x0000000105e8c3d9 do_cmdline + 6614 17 nvim 0x0000000105f03a72 normal_execute + 3996 18 nvim 0x0000000105f89925 state_enter + 164 19 nvim 0x0000000105efe08d normal_enter + 125 20 nvim 0x0000000105ed9ffd main + 6858 21 libdyld.dylib 0x00007fff67c19115 start + 1 Thread 1 Crashed: 0 libsystem_kernel.dylib 0x00007fff67d68e3e __pthread_kill + 10 1 libsystem_pthread.dylib 0x00007fff67ea7150 pthread_kill + 333 2 libsystem_c.dylib 0x00007fff67cc5312 abort + 127 3 libsystem_c.dylib 0x00007fff67c8d368 __assert_rtn + 320 4 libuv.1.dylib 0x00000001060835bf uv_close + 247 5 nvim 0x0000000105fa0ebb tui_terminal_stop + 221 6 nvim 0x0000000105f9ff3d tui_stop + 14 7 nvim 0x0000000105e778b3 multiqueue_process_events + 77 8 nvim 0x0000000105fa0c89 tui_main + 302 9 libsystem_pthread.dylib 0x00007fff67ea46c1 _pthread_body + 340 10 libsystem_pthread.dylib 0x00007fff67ea456d _pthread_start + 377 11 libsystem_pthread.dylib 0x00007fff67ea3c5d thread_start + 13 TODO: - Set `ui->data = NULL` to flag UI as "stopped"? But loop_poll_events drains *all* fast_events, so could skip some events... | |||
| * | | tui: Hint wrapped lines to terminals. | Ricky Zhou | 2018-09-03 | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously, when neovim would wrap a line across multiple lines, terminal emulators could not detect that the lines represent a single wrapped line as opposed to several separate lines. As a result, many terminals' selection/copying functionality would treat a wrapped line as several newline-delimited lines. Fix this by reenabling a "special trick" from Vim. When a line is wrapped, write the last character of that line followed by the first character of the next line to the terminal. This hints to the terminal that the next line is a continuation of the current line. Extends the raw_line event with a "wrap" parameter which controls when to do wrap hinting. | |||
| * | | TUI: use BCE again more often, as it provides smoother resizes and scrolling | Björn Linse | 2018-08-14 | |
| | | | | | | | | | add exceptions for terminals we know doesn't support BCE | |||
| * | | tui: reenable cursor movement optimizations (leftover from #8221) | Björn Linse | 2018-08-14 | |
| | | | ||||
| * | | tui: hack for invalid first line with non-bce resize | Björn Linse | 2018-08-14 | |
| | | | ||||
| * | | tui: use bce properly | Björn Linse | 2018-08-14 | |
| | | | ||||
| * | | cursor_shape: use attribute ids instead of syntax ids | Björn Linse | 2018-08-13 | |
| | | | | | | | | | | | As attribute ids is the convention in the UI protocol Also remove non-threadsafe calls in tui.c to syntax module. | |||
| * | | highlight: HlAttrs is a value type; treat it like such | Björn Linse | 2018-08-13 | |
| | | | ||||
| * | | terminfo: add header guard, stdint.h for int8_t (#8848) | Jan Edmund Lazo | 2018-08-11 | |
| | | | | | | | | | Lint fixes for single-include test. | |||
| * | | terminfo: update built-in terminfo entries | Marco Hinz | 2018-08-10 | |
| | | | | | | | | | | | | | | | The arrays are put in their own file: terminfo_defs.h. This makes it simple to update all terminfo entries in one go using scripts/update_terminfo.sh. The entries were compiled with tic 6.1 and some use the extended number format. | |||
| * | | terminfo: add scripts/update_terminfo.sh | Marco Hinz | 2018-08-10 | |
| | | | | | | | | | | | | | This script updates the built-in terminfo entries. [skip ci] | |||
| * | | tui: clip invalid regions on resize (#8779), fixes #8774 | Björn Linse | 2018-07-26 | |
| | | | ||||
| * | | ui: fix glitches where scrolling region affects clearing of screen | Björn Linse | 2018-07-24 | |
| | | | | | | | | | | | | | | | | | the first implemented UI protocol clients (python-gui and builitin TUI) allowed the cleared region to be restricted by setting the scroll region. This was never used by nvim though, and not documented and implemented by newer clients, to check we remain compatible with both kind of clients, ensure the scroll region is in a reset state. | |||
| * | | ui: use line-based rather than char-based updates in screen.c | Björn Linse | 2018-07-21 | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Add ext_newgrid and ext_hlstate extensions. These use predefined highlights and line-segment based updates, for efficiency and simplicity.. The ext_hlstate extension in addition allows semantic identification of builtin and syntax highlights. Reimplement the old char-based updates in the remote UI layer, for compatibility. For the moment, this is still the default. The bulitin TUI uses the new line-based protocol. cmdline uses curwin cursor position when ext_cmdline is active. | |||
| * | | highlight: refactor to use stateful representation | Björn Linse | 2018-07-21 | |
| | | | | | | | | | | | This allows us to keep track of the source higlight groups, and not only the final combined highlights. | |||
| * | | highlight: extract low-level highlight logic from syntax, ui | Björn Linse | 2018-07-21 | |
| | | | ||||
| * | | Merge pull request #8708 from blueyed/fix-standout | James McCoy | 2018-07-10 | |
| |\ \ | | | | | | | Fix standout mode | |||
| | * | | [WIP/RFC] Fix standout mode | Daniel Hahler | 2018-07-08 | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It was not working for me in different terminals. This patch makes it work in the same way like reverse. Test: :hi jediUsage cterm=standout | hi jediUsage | |||
| * | | | TUI: urxvt: also send xterm focus-reporting seqs #8699 | Daniel Hahler | 2018-07-08 | |
| |/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | urxvt supports the xterm sequence for focus reporting in master / CVS since 2016 [1]. This has not been released yet, but is expected to be in 9.23. In 3d0ee17 a special case for rxvt was added, which requires a custom urxvt extension, see #7578. Since urxvt 9.23 is not released still, and extensions for handling this manually appear to be in use, this sends both escape sequences for rxvt. Fixes https://github.com/neovim/neovim/issues/8695. 1: https://github.com/exg/rxvt-unicode/commit/75264fa544529a21ff79d3da26eb3130c43444a5#diff-2c8f5590ce4fa7495edcf7572c89c77b | |||
| * | | coverity/166184: Null pointer dereference (FP) | Justin M. Keyes | 2018-07-02 | |
| | | | | | | | | | | | False positive: should never happen, because unibi_from_env() would return NULL if $TERM is undefined. | |||
| * | | build/MSVC: TUI: Fix uninitialized variable | b-r-o-c-k | 2018-06-03 | |
| | | | | | | | | | closes #8459 | |||
| * | | TUI: skip SIGWINCH during teardown #8470 | Justin M. Keyes | 2018-06-03 | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | closes #8409 Although 8b05da157728 prevents UI events during TUI teardown, there's still a chance a SIGWINCH event (which emits from a different source, not the UI pump) could be queued. Backtrace: Program terminated with signal SIGSEGV, Segmentation fault. 0 0x0828b5e2 in update_size (ui=0xf7130000) at ../src/nvim/tui/tui.c:1231 1231 if (data->out_isatty Thread 2 (Thread 0xf749c740 (LWP 15704)): 0 0xf76f4be9 in __kernel_vsyscall () No symbol table info available. 1 0xf7585847 in syscall () from /lib32/libc.so.6 No symbol table info available. 2 0x082d280b in uv__epoll_wait (epfd=9, events=events@entry=0xff8570a0, nevents=nevents@entry=1024, timeout=timeout@entry=10) at /home/travis/nvim-deps/build/src/libuv/src/unix/linux-syscalls.c:321 result = -4 3 0x082d095b in uv__io_poll (loop=loop@entry=0x843bb20 <main_loop>, timeout=10) at /home/travis/nvim-deps/build/src/libuv/src/unix/linux-core.c:289 no_epoll_pwait = 0 no_epoll_wait = 0 events = {{events = 1, data = 12}, {events = 0, data = 17828744682641817600}, {events = 0, data = 595427328019700187}, {events = 1, data = 256}, {events = 8, data = 38646673644}, {events = 138656544, data = 0}, {events = 0, data = 4433601024}, {events = 0, data = 0} <repeats 11 times>, {events = 0, data = 5066646634167795712}, {events = 4286935584, data = 206168555883}, {events = 0, data = 471020612051744}, {events = 4286935503, data = 17828744133024637728}, {events = 1, data = 17317007001}, {events = 4286935503, data = 10619564869973704705}, {events = 1024, data = 595525515121881824}, {events = 4150558720, data = 17823414452125790712}, {events = 138530816, data = 4432135917}, {events = 4286935544, data = 10144519793148261088}, {events = 3966, data = 10619579670432006720}, {events = 138530816, data = 595525326143320812}, {events = 1, data = 595525321993555278}, {events = 138656852, data = 1}, {events = 3995, data = 4295967296}, {events = 1, data = 595526644706312193}, {events = 0, data = 17033840295937}, {events = 4286935776, data = 206168555900}, {events = 4286937292, data = 4398046511113}, {events = 4286937584, data = 1}, {events = 0, data = 154475121641}, {events = 534, data = 188970531020}, {events = 4286936336, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 1, data = 10}, {events = 0, data = 0} <repeats 11 times>, {events = 0, data = 48}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 138530816, data = 18412251243033639712}, {events = 4286936040, data = 189114457288}, {events = 0, data = 4294967296}, {events = 0, data = 17803669134559412224}, {events = 44, data = 18412251243033639712}, {events = 4286936088, data = 189114457380}, {events = 43, data = 587839499189486944}, {events = 0, data = 18412250572880084992}, {events = 4145239744, data = 17803668932546221712}, {events = 4286936136, data = 18412251054051721307}, {events = 1, data = 17828741581675430017}, {events = 1, data = 17828941684201750528}, {events = 4151062887, data = 188813018680}, {events = 4286936184, data = 594985324343494205}, {events = 138656544, data = 589074057631462644}, {events = 138657344, data = 17735744192413433899}, {events = 136867048, data = 0}, {events = 138530816, data = 595528757965521683}, {events = 136865087, data = 589073507718137052}, {events = 4129424952, data = 17735744192413433899}, {events = 136867048, data = 587831072767851296}, {events = 4129424604, data = 17735745120263524155}, {events = 43, data = 587839499189486944}, {events = 1, data = 4151078100}, {events = 137102077, data = 18412251277393378816}, {events = 1024, data = 0}, {events = 0, data = 595526301108928512}, {events = 138656544, data = 18412251247181919476}, {events = 1, data = 9281074407080460288}, {events = 0, data = 18446466442728570881}, {events = 4294901792, data = 4294967295}, {events = 35, data = 18446462783416434688}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 2305913371515420672}, {events = 3092376453, data = 138513204574}, {events = 2098047, data = 0}, {events = 0, data = 0}, {events = 8064, data = 196607}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 2147483648, data = 16382}, {events = 3951370240, data = 70402120267857}, {events = 0, data = 0}, {events = 0, data = 5280832615950057472}, {events = 1229539657, data = 5280832617179597129}, {events = 16711680, data = 0}, {events = 255, data = 0}, {events = 0, data = 8589934592}, {events = 0, data = 0}, {events = 4144925328, data = 8589934600}, {events = 0, data = 0}, {events = 4144060920, data = 8589934597}, {events = 0, data = 0} <repeats 11 times>, {events = 0, data = 10441860757015494656}, {events = 2357, data = 1000000}, {events = 0, data = 0}, {events = 138656544, data = 0}, {events = 0, data = 5066646694297337856}, {events = 948, data = 7}, {events = 832, data = 0}, {events = 0, data = 0}, {events = 0, data = 12884901888}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 4400483032669}, {events = 4286937344, data = 17826513962666277708}, {events = 4286937112, data = 594985328358030594}, {events = 137168621, data = 18412254696048689153}, {events = 4286937344, data = 1024}, {events = 1000000, data = 2896717541055035201}, {events = 4148807356, data = 595525510834946052}, {events = 137169476, data = 10125674444609}, {events = 1000000, data = 0}, {events = 0, data = 595525321856385024}, {events = 0, data = 0}, {events = 0, data = 18412255692481101824}, {events = 10125674, data = 48}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 0}, {events = 0, data = 1179670597}, {events = 0, data = 4400482871034}, {events = 4286937584, data = 17826513962666277708}, {events = 4286937352, data = 594985328358030594}, {events = 137168621, data = 18412255726840840193}, {events = 4286937584, data = 17160756302592}, {events = 1000000, data = 594985326644596377}, {events = 4286937584, data = 4433623840}, {events = 137169713, data = 595526352787192608}, {events = 1, data = 0}, {events = 0, data = 1}, {events = 1, data = 138656852}, {events = 0, data = 18412256723273256859}, {events = 10125669, data = 48}, {events = 0, data = 0} <repeats 11 times>, {events = 0, data = 4294967296}, {events = 12, data = 0}, {events = 0, data = 0}, {events = 2430806547, data = 18412258097662788608}, {events = 138656588, data = 18412257105380933632}, {events = 4149837058, data = 589134741370949632}...} pe = <optimized out> e = {events = 4127768836, data = 7} real_timeout = 10 q = <optimized out> w = <optimized out> sigset = {__val = {832, 0, 0, 138656544, 0, 0, 4286935144, 135300669, 4144063488, 138656544, 138633728, 0, 0, 0, 0, 0, 0, 0, 4286935224, 135309369, 4144063520, 135309195, 138633728, 0, 0, 0, 0, 0, 138633728, 135309195, 138633728, 0}} sigmask = <optimized out> base = <optimized out> have_signals = <optimized out> nevents = <optimized out> count = 48 nfds = <optimized out> fd = <optimized out> op = <optimized out> i = <optimized out> __PRETTY_FUNCTION__ = "uv__io_poll" 4 0x082c0cab in uv_run (loop=0x843bb20 <main_loop>, mode=UV_RUN_ONCE) at /home/travis/nvim-deps/build/src/libuv/src/unix/core.c:359 timeout = <optimized out> r = 1 5 0x08107e61 in loop_poll_events (loop=0x843bb20 <main_loop>, ms=10) at ../src/nvim/event/loop.c:57 mode = UV_RUN_ONCE timeout_expired = false 6 0x0829225a in ui_bridge_stop (b=0xf70330e0) at ../src/nvim/ui_bridge.c:122 bridge = 0xf70330e0 stopped = false 7 0x0828f0a5 in ui_builtin_stop () at ../src/nvim/ui.c:144 ui = 0xf70330e0 i = 0 8 0x081e9b85 in mch_exit (r=1) at ../src/nvim/os_unix.c:141 No locals. 9 0x0818076e in getout (exitval=1) at ../src/nvim/main.c:666 tp = 0x0 next_tp = 0x0 10 0x081a80df in preserve_exit () at ../src/nvim/misc1.c:2655 really_exiting = true 11 0x081e8e2e in deadly_signal (signum=1) at ../src/nvim/os/signal.c:137 No locals. 12 0x081e8eaa in on_signal (handle=0x8436200 <shup>, signum=1, data=0x0) at ../src/nvim/os/signal.c:162 __PRETTY_FUNCTION__ = "on_signal" __func__ = "on_signal" 13 0x0810a7bb in signal_event (argv=0xff85a328) at ../src/nvim/event/signal.c:47 watcher = 0x8436200 <shup> 14 0x0810869b in multiqueue_process_events (this=0xf7016420) at ../src/nvim/event/multiqueue.c:150 event = {handler = 0x810a78b <signal_event>, argv = {0x8436200 <shup>, 0x0, 0x0, 0x0, 0x0, 0x0}} __PRETTY_FUNCTION__ = "multiqueue_process_events" 15 0x08107eac in loop_poll_events (loop=0x843bb20 <main_loop>, ms=3984) at ../src/nvim/event/loop.c:65 mode = UV_RUN_ONCE timeout_expired = false 16 0x081e5d6f in input_poll (ms=4000) at ../src/nvim/os/input.c:349 remaining = 3984 before = 10125692630347 17 0x081e5e50 in inbuf_poll (ms=4000) at ../src/nvim/os/input.c:372 No locals. 18 0x081e568f in os_inchar (buf=0x0, maxlen=0, ms=-1, tb_change_cnt=0) at ../src/nvim/os/input.c:110 result = (unknown: 136905872) 19 0x0826b0a1 in state_enter (s=0xff85a4c0) at ../src/nvim/state.c:55 check_result = 1 key = 58 execute_result = 1 20 0x0813802b in command_line_enter (firstc=58, count=1, indent=0) at ../src/nvim/ex_getln.c:392 state = {state = {check = 0x8138588 <command_line_check>, execute = 0x81385b3 <command_line_execute>}, firstc = 58, count = 1, indent = 0, c = 58, i = 0, j = 1, gotesc = 0, do_abbr = 1, lookfor = 0x0, hiscnt = 10000, histype = 0, search_start = {lnum = 1, col = 0, coladd = 0}, save_cursor = {lnum = 1, col = 0, coladd = 0}, old_curswant = 0, init_curswant = 0, old_leftcol = 0, init_leftcol = 0, old_topline = 1, init_topline = 1, old_topfill = 0, init_topfill = 0, old_botline = 2, init_botline = 2, match_start = {lnum = 1, col = 0, coladd = 0}, match_end = {lnum = 0, col = 0, coladd = 0}, did_incsearch = 0, incsearch_postponed = 0, did_wild_list = 0, wim_index = 0, res = 0, save_msg_scroll = 0, save_State = 1, save_p_icm = 0xf7015e50 "", some_key_typed = 1, ignore_drag_release = 1, break_ctrl_c = 0, xpc = {xp_context = 0, xp_pattern = 0x0, xp_pattern_len = 0, xp_arg = 0x0, xp_scriptID = 0, xp_backslash = 0, xp_shell = 0, xp_numfiles = -1, xp_files = 0x0, xp_line = 0x0, xp_col = 0}, b_im_ptr = 0x0, save_ccline = {cmdbuff = 0x0, cmdbufflen = 0, cmdlen = 0, cmdpos = 0, cmdspos = 0, cmdfirstc = 0, cmdindent = 0, cmdprompt = 0x0, cmdattr = 0, overstrike = 0, xpc = 0x0, xp_context = 0, xp_arg = 0x0, input_fn = 0, prompt_id = 0, highlight_callback = {data = {funcref = 0x0, partial = 0x0}, type = kCallbackNone}, last_colors = {prompt_id = 0, cmdbuff = 0x0, colors = {size = 0, capacity = 0, items = 0x0}}, level = 0, prev_ccline = 0x0, special_char = 0 '\000', special_shift = false, redraw_state = kCmdRedrawNone}} s = 0xff85a4c0 tstate = {current_exception = 0x832fc5a <arena_run_split_remove+74>, private_msg_list = 0xcb, msg_list = 0xc8, trylevel = 309, got_int = 0, need_rethrow = 0, did_emsg = -148897536} err = {type = kErrorTypeNone, msg = 0x0} tl_ret = true dict = 0xf701e180 firstcbuf = ":" 21 0x0813bf33 in getcmdline (firstc=58, count=1, indent=0) at ../src/nvim/ex_getln.c:1991 No locals. 22 0x0813c273 in getexline (c=58, cookie=0x0, indent=0) at ../src/nvim/ex_getln.c:2171 No locals. 23 0x0812178e in do_cmdline (cmdline=0x0, fgetline=0x813c23b <getexline>, cookie=0x0, flags=0) at ../src/nvim/ex_docmd.c:521 next_cmdline = 0x0 cmdline_copy = 0x0 used_getline = 0 recursive = 0 msg_didout_before_start = 0 count = 0 did_inc = 0 retval = 1 cstack = {cs_flags = {-149727708, -149727552, 44, -149749760, 0, -8018024, 135896356, 44, 0, -8018008, 137102848, 138530816, -149749760, -165425056, -149727552, -153095488, 0, -8017976, 135301762, -165613500, -149727516, 136875711, -143908912, -153095488, 8, 18, -143904672, 8, -143889324, -8017928, 137102848, 138530816, -149749760, 0, 137154491, -153095488, 0, -149749760, 136875711, -149749760, 0, 136875711, 135298863, -153095488, 136911089, -150785824, 135298732, 0, 0, -149749760}, cs_pending = "@\004!\366 d\001\367\000\000\000\000h\250\205\377\023\217(\b\240\357\337\366\361\030)\b\340\060\003\367\254~\020\b\000\000\000\000\000\000\000\000\000\000\023\367@\004", cs_pend = {csp_rv = {0x0, 0x0, 0xff85a888, 0x81fb319 <rbuffer_consumed+138>, 0xf70b3e00, 0x2, 0xff85a8b8, 0x829198a <ui_bridge_flush+117>, 0x82918f1 <ui_bridge_flush_event>, 0xf70330e0, 0x8107eac <loop_poll_events+230>, 0x0, 0x0, 0x108, 0xff85a8c8, 0x81fb4bf <rbuffer_read+152>, 0xf70b3e00, 0xff85a8ac, 0x2b, 0x8107eac <loop_poll_events+230>, 0x0, 0x0, 0xf7130000, 0x0, 0x0, 0xf70b3e4b, 0x58, 0x2b, 0xf70330e0, 0x0, 0xff85a8f8, 0x8161750 <fix_input_buffer+11>, 0xf70b3e00, 0x843070b <typebuf_init+43>, 0xff85a9a8, 0xf7648000, 0xff85a908, 0xf7597d02 <clock_gettime+34>, 0x841d000, 0x82cdd00 <uv__run_timers+16>, 0x1, 0xff85a908, 0xff85a9d8, 0x816172b <inchar+496>, 0x84306e0 <typebuf_init>, 0xf4240, 0xff85a928, 0x8108748 <multiqueue_empty+62>, 0xf7016424, 0x843bb20 <main_loop>}, csp_ex = {0x0, 0x0, 0xff85a888, 0x81fb319 <rbuffer_consumed+138>, 0xf70b3e00, 0x2, 0xff85a8b8, 0x829198a <ui_bridge_flush+117>, 0x82918f1 <ui_bridge_flush_event>, 0xf70330e0, 0x8107eac <loop_poll_events+230>, 0x0, 0x0, 0x108, 0xff85a8c8, 0x81fb4bf <rbuffer_read+152>, 0xf70b3e00, 0xff85a8ac, 0x2b, 0x8107eac <loop_poll_events+230>, 0x0, 0x0, 0xf7130000, 0x0, 0x0, 0xf70b3e4b, 0x58, 0x2b, 0xf70330e0, 0x0, 0xff85a8f8, 0x8161750 <fix_input_buffer+11>, 0xf70b3e00, 0x843070b <typebuf_init+43>, 0xff85a9a8, 0xf7648000, 0xff85a908, 0xf7597d02 <clock_gettime+34>, 0x841d000, 0x82cdd00 <uv__run_timers+16>, 0x1, 0xff85a908, 0xff85a9d8, 0x816172b <inchar+496>, 0x84306e0 <typebuf_init>, 0xf4240, 0xff85a928, 0x8108748 <multiqueue_empty+62>, 0xf7016424, 0x843bb20 <main_loop>}}, cs_forinfo = {0x2, 0x82c0cb3 <uv_run+291>, 0x843bb20 <main_loop>, 0x0, 0xff85a968, 0x81086a6 <multiqueue_process_events+103>, 0xf7016420, 0x0, 0x843bb44 <main_loop+36>, 0xff85a948, 0xf70b3e00, 0x1, 0xff85a978, 0x81e5fd4 <process_interrupts+126>, 0xf70b3e00, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff85a9a8, 0x8107eac <loop_poll_events+230>, 0xf7016420, 0x2, 0x80, 0xf76c6892 <__lll_lock_wait+34>, 0xff85aa18, 0x1, 0xff85a9a8, 0x815f1ab <may_sync_undo+55>, 0x0, 0x0, 0x6d2000, 0x2, 0x0, 0x0, 0xff85a9d8, 0x815f15b <gotchars+134>, 0x3a, 0x0, 0x0, 0x82ccfbb <uv_mutex_unlock+27>, 0xf6220638, 0x0, 0x84306e1 <typebuf_init+1>, 0x3a, 0x0, 0x0, 0xff85aab8, 0x81608af <vgetorpeek+2629>}, cs_line = {1, 0, -1, 1, -149727600, 0, -8017384, 135300936, -150903772, 43, 2248736, 0, 138656544, 58, 58, 0, -150903776, 0, -8017256, -144408576, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 10125, 674433438, 138530816, 0, 0, 137103323, 0, 257, -8017256, 136208557, -150258176, 1000000, 5330103, 136221690, 0, 0, 0, 136207882, 5330103, 0}, cs_idx = -1, cs_looplevel = 0, cs_trylevel = 0, cs_emsg_silent_list = 0x0, cs_lflags = 0} lines_ga = {ga_len = 0, ga_maxlen = 0, ga_itemsize = 8, ga_growsize = 10, ga_data = 0x0} current_line = 0 fname = 0x0 breakpoint = 0x0 dbg_tick = 0x0 debug_saved = {trylevel = 0, force_abort = 0, caught_stack = 0x0, vv_exception = 0x0, vv_throwpoint = 0x0, did_emsg = 0, got_int = 0, need_rethrow = 0, check_cstack = 0, current_exception = 0x0} initial_trylevel = 0 saved_msg_list = 0x0 private_msg_list = 0x0 cmd_getline = 0x813c23b <getexline> cmd_cookie = 0x0 cmd_loop_cookie = {lines_gap = 0xff85a748, current_line = 135896356, repeating = 44, getline = 0x30, cookie = 0xff85a758} real_cookie = 0x0 getline_is_func = 0 call_depth = 1 24 0x081bc48e in nv_colon (cap=0xff85abdc) at ../src/nvim/normal.c:4561 old_p_im = 0 cmd_result = 255 is_cmdkey = false 25 0x081b5382 in normal_execute (state=0xff85ab70, key=58) at ../src/nvim/normal.c:1137 s = 0xff85ab70 __PRETTY_FUNCTION__ = "normal_execute" 26 0x0826b0ec in state_enter (s=0xff85ab70) at ../src/nvim/state.c:67 check_result = 1 key = 58 execute_result = 1 27 0x081b3a1d in normal_enter (cmdwin=false, noexmode=false) at ../src/nvim/normal.c:467 state = {state = {check = 0x81b5881 <normal_check>, execute = 0x81b4cee <normal_execute>}, conceal_old_cursor_line = 0, conceal_new_cursor_line = 0, command_finished = false, ctrl_w = false, need_flushbuf = false, conceal_update_lines = 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}, ca = {oap = 0xff85ab8c, prechar = 0, cmdchar = 58, nchar = 0, ncharC1 = 0, ncharC2 = 0, extra_char = 0, opcount = 0, count0 = 0, count1 = 1, arg = 0, retval = 0, searchbuf = 0x0}, mapped_len = 0, old_mapped_len = 0, idx = 60, c = 58, old_col = 0, old_pos = {lnum = 1, col = 0, coladd = 0}} 28 0x08180336 in main (argc=7, argv=0xff85adc4) at ../src/nvim/main.c:566 fname = 0x0 params = {argc = 7, argv = 0xff85adc4, use_vimrc = 0xff85b50d "NONE", 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 = 1, pre_commands = {0xff85b520 "set noswapfile noshowcmd noruler undodir=. directory=. viewdir=. backupdir=.", 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, edit_type = 0, tagname = 0x0, use_ef = 0x0, want_full_screen = 1, input_isatty = true, output_isatty = true, err_isatty = true, no_swap_file = 0, use_debug_break_level = -1, window_count = 1, window_layout = 0, diff_mode = 0, listen_addr = 0x0} cwd = 0x0 __PRETTY_FUNCTION__ = "main" reading_input = true Thread 1 (Thread 0xf6dffb40 (LWP 15705)): 0 0x0828b5e2 in update_size (ui=0xf7130000) at ../src/nvim/tui/tui.c:1231 data = 0x0 width = 0 height = 0 val = 0x8199d72 <xfree+17> "\311\303U\211\345\203\354(\203}\b" advance = 0 1 0x08288f42 in sigwinch_cb (watcher=0xf622091c, signum=0, data=0xf7130000) at ../src/nvim/tui/tui.c:408 ui = 0xf7130000 2 0x0810a7bb in signal_event (argv=0xf6dfeeb8) at ../src/nvim/event/signal.c:47 watcher = 0xf622091c 3 0x0810869b in multiqueue_process_events (this=0xf620f020) at ../src/nvim/event/multiqueue.c:150 event = {handler = 0x810a78b <signal_event>, argv = {0xf622091c, 0x82d27cb <uv__epoll_ctl+59>, 0xff, 0x14, 0x0, 0x0}} __PRETTY_FUNCTION__ = "multiqueue_process_events" 4 0x08107eac in loop_poll_events (loop=0xf6dfefa0, ms=20) at ../src/nvim/event/loop.c:65 mode = UV_RUN_ONCE timeout_expired = true 5 0x08288d08 in tui_main (bridge=0xf70330e0, ui=0xf7130000) at ../src/nvim/tui/tui.c:362 ms = 3 tui_loop = {uv = {data = 0xf6dfefa0, active_handles = 2, handle_queue = {0xf6dff104, 0xf62204fc}, active_reqs = {0xf6dfefb0, 0xf6dfefb0}, stop_flag = 0, flags = 0, backend_fd = 15, pending_queue = {0xf6dfefc4, 0xf6dfefc4}, watcher_queue = {0xf6dfefcc, 0xf6dfefcc}, watchers = 0xf620c000, nwatchers = 30, nfds = 2, wq = {0xf6dfefe0, 0xf6dfefe0}, wq_mutex = {__data = {__lock = 0, __count = 0, __owner = 0, __kind = 0, __nusers = 0, {d = {__espins = 0, __elision = 0}, __list = {__next = 0x0}}}, __size = '\000' <repeats 23 times>, __align = 0}, wq_async = {data = 0x0, loop = 0xf6dfefa0, type = UV_ASYNC, close_cb = 0x0, handle_queue = {0xf6dff290, 0xf6dff104}, u = {fd = 0, reserved = {0x0, 0x0, 0x0, 0x0}}, next_closing = 0x0, flags = 49152, async_cb = 0x82d3fe0 <uv__work_done>, queue = {0xf6dff2b4, 0xf6dff084}, pending = 0}, cloexec_lock = {__data = {__lock = 0, __nr_readers = 0, __readers_wakeup = 0, __writer_wakeup = 0, __nr_readers_queued = 0, __nr_writers_queued = 0, __flags = 0 '\000', __shared = 0 '\000', __pad1 = 0 '\000', __pad2 = 0 '\000', __writer = 0}, __size = '\000' <repeats 31 times>, __align = 0}, closing_handles = 0x0, process_handles = {0xf6dff064, 0xf6dff064}, prepare_handles = {0xf6dff06c, 0xf6dff06c}, check_handles = {0xf6dff074, 0xf6dff074}, idle_handles = {0xf6dff07c, 0xf6dff07c}, async_handles = {0xf6dff034, 0xf6dff2b4}, async_unused = 0x0, async_io_watcher = {cb = 0x82c01f0 <uv__async_io>, pending_queue = {0xf6dff094, 0xf6dff094}, watcher_queue = {0xf6dff09c, 0xf6dff09c}, pevents = 1, events = 1, fd = 18}, async_wfd = -1, timer_heap = {min = 0x0, nelts = 0}, timer_counter = 5, time = 10125712, signal_pipefd = {16, 17}, signal_io_watcher = {cb = 0x82c9900 <uv__signal_event>, pending_queue = {0xf6dff0d8, 0xf6dff0d8}, watcher_queue = {0xf6dff0e0, 0xf6dff0e0}, pevents = 1, events = 1, fd = 16}, child_watcher = {data = 0x0, loop = 0xf6dfefa0, type = UV_SIGNAL, close_cb = 0x0, handle_queue = {0xf6dff010, 0xf6dfefa8}, u = {fd = 0, reserved = {0x0, 0x0, 0x0, 0x0}}, next_closing = 0x0, flags = 32768, signal_cb = 0x0, signum = 0, tree_entry = {rbe_left = 0x0, rbe_right = 0x0, rbe_parent = 0x0, rbe_color = 0}, caught_signals = 0, dispatched_signals = 0}, emfile_fd = 19, inotify_read_watcher = {cb = 0x0, pending_queue = {0x0, 0x0}, watcher_queue = {0x0, 0x0}, pevents = 0, events = 0, fd = 0}, inotify_watchers = 0x0, inotify_fd = -1}, events = 0xf620f000, thread_events = 0xf620f040, fast_events = 0xf620f020, children = 0xf620d000, children_watcher = {data = 0xf6dff1b0, loop = 0xf6dfefa0, type = UV_SIGNAL, close_cb = 0xf74a1ed4, handle_queue = {0xf6dff1e0, 0xf6dff290}, u = {fd = 0, reserved = {0x0, 0x0, 0x0, 0x0}}, next_closing = 0x0, flags = 8192, signal_cb = 0x0, signum = 0, tree_entry = {rbe_left = 0x5, rbe_right = 0x421, rbe_parent = 0xf7669aa0, rbe_color = -144272712}, caught_signals = 0, dispatched_signals = 0}, children_kill_timer = {data = 0xf76b9f94, loop = 0xf6dfefa0, type = UV_TIMER, close_cb = 0x0, handle_queue = {0xf6dff238, 0xf6dff190}, u = {fd = -153095436, reserved = {0xf6dff2f4, 0xf76f0608, 0xf6dff2b0, 0xf76fe91a}}, next_closing = 0x0, flags = 8192, timer_cb = 0x0, heap_node = {0xf7716a94, 0x0, 0xf7669aa0}, timeout = 5, repeat = 0, start_id = 0}, poll_timer = {data = 0xf620e008, loop = 0xf6dfefa0, type = UV_TIMER, close_cb = 0x0, handle_queue = {0xf622092c, 0xf6dff1e0}, u = {fd = -153095436, reserved = {0xf6dff2f4, 0xf6dff268, 0xf6dff260, 0xf76bb648}}, next_closing = 0x0, flags = 8192, timer_cb = 0x8108315 <timer_cb>, heap_node = {0x0, 0x0, 0x0}, timeout = 10125732, repeat = 20, start_id = 4}, async = {data = 0x0, loop = 0xf6dfefa0, type = UV_ASYNC, close_cb = 0x0, handle_queue = {0xf6dff190, 0xf6dff010}, u = {fd = 0, reserved = {0x0, 0x0, 0x0, 0xf7716000}}, next_closing = 0x0, flags = 24576, async_cb = 0x810826b <async_cb>, queue = {0xf6dff084, 0xf6dff034}, pending = 0}, mutex = {__data = {__lock = 0, __count = 0, __owner = 0, __kind = 0, __nusers = 0, {d = {__espins = 0, __elision = 0}, __list = {__next = 0x0}}}, __size = '\000' <repeats 23 times>, __align = 0}, recursive = 0} data = 0xf6210440 6 0x08292172 in ui_thread_run (data=0xf70330e0) at ../src/nvim/ui_bridge.c:104 bridge = 0xf70330e0 7 0xf76bff5b in start_thread (arg=0xf6dffb40) at pthread_create.c:312 __res = <optimized out> pd = 0xf6dffb40 now = <optimized out> unwind_buf = {cancel_jmp_buf = {{jmp_buf = {-143843328, -153093312, 4001536, -153095192, -1395719907, -992530146}, mask_was_saved = 0}}, priv = {pad = {0x0, 0x0, 0x0, 0x0}, data = {prev = 0x0, cleanup = 0x0, canceltype = 0}}} not_first_call = <optimized out> pagesize_m1 = <optimized out> sp = <optimized out> freesize = <optimized out> __PRETTY_FUNCTION__ = "start_thread" 8 0xf758a52e in clone () from /lib32/libc.so.6 No symbol table info available. | |||
| * | | Merge #8218 'Fix errors reported by PVS' | Justin M. Keyes | 2018-04-27 | |
| |\ \ | | | | | | | closes #4983 | |||
| | * | | *: Fix clint errors | ZyX | 2018-04-22 | |
| | | | | ||||
| | * | | tui: Silence PVS/V560: condition is set to true in prev-previous if() | ZyX | 2018-04-22 | |
| | | | | ||||
| * | | | tui/input.c: add support for mouse release events in urxvt (#8309) | symphorien | 2018-04-22 | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Some terminals don't report which buttons are involved in some mouse events. For example, the urxvt protocol (http://www.huge-man-linux.net/man7/urxvt.html section "Mouse reporting") does not report which button has been released. In this case libtermkey reports button 0 (http://www.leonerd.org.uk/code/libtermkey/doc/termkey_interpret_mouse.3.html) Up to now, forward_mouse_event did not handle button==0. On press events there is not much we can do, and we keep the current behavior which is dropping the event. But on drag-and-release events we can compensate by remembering the last button pressed. fixes #3182 for urxvt fixes #5400 | |||
| * | | | tui: abort on unexpected enum value (#8266) | John Szakmeister | 2018-04-13 | |
| | | | | | | | | | | ref #8261 | |||
| * | | | tui: fix uninitialize variable usage (#8261) | John Szakmeister | 2018-04-12 | |
| | | | | | | | | | | | | | | | | This fixes an issue with compiles failing in release mode due to shape having the possibility of being used uninitialized (since the default case was missing). | |||
| * | | | build/clang 6.0.0: fix type conversion warnings (#8235) | Marco Hinz | 2018-04-07 | |
| | | | | ||||
| * | | | TUI: EMSG2 must not be used from TUI thread | Björn Linse | 2018-04-06 | |
| |/ / | ||||
| * | | TUI: implement "standout" attribute #8081 | Nimit Bhardwaj | 2018-03-27 | |
| | | | | | | | | | closes #8054 | |||
| * | | ui_bridge: make sure TUI receives no more UI events after "stop" event | Björn Linse | 2018-02-22 | |
| | | | ||||
| * | | ui/tui: highlighting refactor | Björn Linse | 2018-02-11 | |
| | | | | | | | | | | | | | | | | | Make HlAttr contain highlighting state for both color modes (cterm and rgb). This allows us to implement termguicolors completely in the TUI. Simplify some logic duplicated between ui.c and screen.c. Also avoid some superfluous highlighting reset events. | |||
| * | | tui: libtermkey: force CSI driver for mouse input #7948 | Chih-Hsuan Yen | 2018-01-31 | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fixes #7932 Nvim (tui.c) always enables SGR mouse (TUIData.unibi_ext.enable_mouse). But if libtermkey sees key_mouse (kmous) in terminfo its terminfo driver (driver-ti.c) will be activated, which by accident only supports X10 protocol. The libtermkey CSI driver (driver-csi.c), in contrast, supports SGR. We can force libtermkey to ignore the terminfo key_mouse entry by returning NULL in the tui_tk_ti_getstr hook. That forces the CSI driver. What is the effect of returning NULL from `tui_tk_ti_getstr()`? - libtermkey `driver-ti.c:load_terminfo()` skips the entry. - `termkey.c:peekkey()` iterates through all drivers, it finds `TERMKEY_RES_NONE` for the ti driver and falls back to the CSI driver. | |||
| * | | tui: fix use-after-free after UI `stop` event #7922 | Justin M. Keyes | 2018-01-28 | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ui_bridge:ui_bridge_stop() calls ui_detach_impl() last, so the check for ui_active() in ui:ui_refresh() doesn't help: tui_main() already freed the `ui` object. There is a race between ui_bridge_stop (thread T0) and tui_main (thread T1). UIBridgeData.stopped could be set while ui_bridge_stop() is in the middle of loop_poll_events(), which may invoke tui_scheduler() on T0. The pointers in tui_scheduler() may be invalid by then. Solution(?): Use the `UI.data` field as a "stopped" flag and check it in tui_scheduler(). ASAN use-after-free report observed in #7908: = ==20066==ERROR: AddressSanitizer: heap-use-after-free on address 0x611000000cd0 at pc 0x00000182abed bp 0x7ffe23b07070 sp 0x7ffe23b07068 = READ of size 8 at 0x611000000cd0 thread T0 = 0 0x182abec in tui_scheduler /home/travis/build/neovim/neovim/src/nvim/tui/tui.c:393:23 = 1 0x1876afd in ui_bridge_update_fg /home/travis/build/neovim/neovim/build/src/nvim/auto/ui_events_bridge.generated.h:205:3 = 2 0x186c130 in ui_resize /home/travis/build/neovim/neovim/src/nvim/ui.c:310:3 = 3 0x146b9c2 in screen_resize /home/travis/build/neovim/neovim/src/nvim/screen.c:7483:3 = 4 0x186a6f0 in ui_refresh /home/travis/build/neovim/neovim/src/nvim/ui.c:284:3 = 5 0x186bbe0 in ui_refresh_event /home/travis/build/neovim/neovim/src/nvim/ui.c:297:3 = 6 0xa2219a in multiqueue_process_events /home/travis/build/neovim/neovim/src/nvim/event/multiqueue.c:150:7 = 7 0xa1bd7f in loop_poll_events /home/travis/build/neovim/neovim/src/nvim/event/loop.c:63:3 = 8 0x1872709 in ui_bridge_stop /home/travis/build/neovim/neovim/src/nvim/ui_bridge.c:121:5 = 9 0x1864247 in ui_builtin_stop /home/travis/build/neovim/neovim/src/nvim/ui.c:143:3 = 10 0x1249ec8 in mch_exit /home/travis/build/neovim/neovim/src/nvim/os_unix.c:140:3 = 11 0xe56ba9 in getout /home/travis/build/neovim/neovim/src/nvim/main.c:671:3 = 12 0xfc4c8f in preserve_exit /home/travis/build/neovim/neovim/src/nvim/misc1.c:2653:3 = 13 0x1247c02 in deadly_signal /home/travis/build/neovim/neovim/src/nvim/os/signal.c:137:3 = 14 0x1247921 in on_signal /home/travis/build/neovim/neovim/src/nvim/os/signal.c:162:9 = 15 0xa35618 in signal_event /home/travis/build/neovim/neovim/src/nvim/event/signal.c:47:3 = 16 0xa2219a in multiqueue_process_events /home/travis/build/neovim/neovim/src/nvim/event/multiqueue.c:150:7 = 17 0xa1bd7f in loop_poll_events /home/travis/build/neovim/neovim/src/nvim/event/loop.c:63:3 = 18 0x1237bd6 in input_poll /home/travis/build/neovim/neovim/src/nvim/os/input.c:349:3 = 19 0x123334f in inbuf_poll /home/travis/build/neovim/neovim/src/nvim/os/input.c:372:24 = 20 0x123316d in os_inchar /home/travis/build/neovim/neovim/src/nvim/os/input.c:110:19 = 21 0x170d20e in state_enter /home/travis/build/neovim/neovim/src/nvim/state.c:55:13 = 22 0xbd7441 in command_line_enter /home/travis/build/neovim/neovim/src/nvim/ex_getln.c:384:3 = 23 0xbd0a60 in getcmdline /home/travis/build/neovim/neovim/src/nvim/ex_getln.c:1920:10 = 24 0xbdb365 in getexline /home/travis/build/neovim/neovim/src/nvim/ex_getln.c:2100:10 = 25 0xb00a6b in do_cmdline /home/travis/build/neovim/neovim/src/nvim/ex_docmd.c:528:47 = 26 0x10a7837 in nv_colon /home/travis/build/neovim/neovim/src/nvim/normal.c:4552:18 = 27 0x1091e15 in normal_execute /home/travis/build/neovim/neovim/src/nvim/normal.c:1136:3 = 28 0x170d439 in state_enter /home/travis/build/neovim/neovim/src/nvim/state.c:67:26 = 29 0x104ee14 in normal_enter /home/travis/build/neovim/neovim/src/nvim/normal.c:466:3 = 30 0xe4295c in main /home/travis/build/neovim/neovim/src/nvim/main.c:572:3 = 31 0x2b2ba340bf44 in __libc_start_main /build/eglibc-ripdx6/eglibc-2.19/csu/libc-start.c:287 = 32 0x44d24b in _start (/home/travis/build/neovim/neovim/build/bin/nvim+0x44d24b) = = 0x611000000cd0 is located 16 bytes inside of 240-byte region [0x611000000cc0,0x611000000db0) = freed by thread T1 here: = 0 0x4ee0e2 in __interceptor_free /local/mnt/workspace/tmp/ubuntu_rel/llvm/utils/release/final/llvm.src/projects/compiler-rt/lib/asan/asan_malloc_linux.cc:47:3 = 1 0xf4f6d4 in xfree /home/travis/build/neovim/neovim/src/nvim/memory.c:133:3 = 2 0x182a963 in tui_main /home/travis/build/neovim/neovim/src/nvim/tui/tui.c:383:3 = 3 0x18792b0 in ui_thread_run /home/travis/build/neovim/neovim/src/nvim/ui_bridge.c:106:3 = 4 0x2b2ba2697183 in start_thread /build/eglibc-ripdx6/eglibc-2.19/nptl/pthread_create.c:312 = = previously allocated by thread T0 here: = 0 0x4ee61a in calloc /local/mnt/workspace/tmp/ubuntu_rel/llvm/utils/release/final/llvm.src/projects/compiler-rt/lib/asan/asan_malloc_linux.cc:76:3 = 1 0xf4f787 in xcalloc /home/travis/build/neovim/neovim/src/nvim/memory.c:147:15 = 2 0x182000a in tui_start /home/travis/build/neovim/neovim/src/nvim/tui/tui.c:127:12 = 3 0x1863f7c in ui_builtin_start /home/travis/build/neovim/neovim/src/nvim/ui.c:125:3 = 4 0xe41bb9 in main /home/travis/build/neovim/neovim/src/nvim/main.c:457:5 = 5 0x2b2ba340bf44 in __libc_start_main /build/eglibc-ripdx6/eglibc-2.19/csu/libc-start.c:287 = = Thread T1 created by T0 here: = 0 0x4d774d in __interceptor_pthread_create /local/mnt/workspace/tmp/ubuntu_rel/llvm/utils/release/final/llvm.src/projects/compiler-rt/lib/asan/asan_interceptors.cc:317:3 = 1 0x1aae6b0 in uv_thread_create /home/travis/nvim-deps/build/src/libuv/src/unix/thread.c:75 = 2 0x18217fa in tui_start /home/travis/build/neovim/neovim/src/nvim/tui/tui.c:159:10 = 3 0x1863f7c in ui_builtin_start /home/travis/build/neovim/neovim/src/nvim/ui.c:125:3 = 4 0xe41bb9 in main /home/travis/build/neovim/neovim/src/nvim/main.c:457:5 = 5 0x2b2ba340bf44 in __libc_start_main /build/eglibc-ripdx6/eglibc-2.19/csu/libc-start.c:287 --- Alternative attempt: commit 6ad9c02491606a0c31e907f38c9931f324327aa5 Author: Justin M. Keyes <justinkz@gmail.com> Date: Sat Jan 27 15:12:58 2018 +0100 tui: fix use-after-free: swap in empty scheduler This should make life easier for UIs like VimR which implement their own in-process bridged UI: they don't need to worry that their `scheduler` might receive an invalid pointer. To avoid that, ui_bridge_stopped() swaps in an empty scheduler. Note that this requires the call to loop_poll_events() to be moved into the critical section. diff --git a/src/nvim/ui_bridge.c b/src/nvim/ui_bridge.c index 779585416f80..491052d19d3b 100644 --- a/src/nvim/ui_bridge.c +++ b/src/nvim/ui_bridge.c @@ -93,10 +93,18 @@ UI *ui_bridge_attach(UI *ui, ui_main_fn ui_main, event_scheduler scheduler) return &rv->bridge; } +static void ui_bridge_null_scheduler(Event event, void *d) +{ + WLOG("ignoring event (bridge stopped)"); +} + void ui_bridge_stopped(UIBridgeData *bridge) { uv_mutex_lock(&bridge->mutex); bridge->stopped = true; + // Replace with an empty scheduler, so that the UI internal scheduler does + // not get invoked with an invalid pointer. #7922 + bridge->scheduler = ui_bridge_null_scheduler; uv_mutex_unlock(&bridge->mutex); } @@ -111,14 +119,11 @@ static void ui_bridge_stop(UI *b) UIBridgeData *bridge = (UIBridgeData *)b; bool stopped = bridge->stopped = false; UI_BRIDGE_CALL(b, stop, 1, b); - for (;;) { + while (!stopped) { uv_mutex_lock(&bridge->mutex); stopped = bridge->stopped; - uv_mutex_unlock(&bridge->mutex); - if (stopped) { - break; - } loop_poll_events(&main_loop, 10); // Process one event (at most). + uv_mutex_unlock(&bridge->mutex); } uv_thread_join(&bridge->ui_thread); uv_mutex_destroy(&bridge->mutex); | |||
| * | | Fix for lint | George Zhao | 2018-01-19 | |
| | | | ||||
| * | | Fix bug, use &loop->uv replace loop. | George Zhao | 2018-01-18 | |
| | | | ||||
| * | | Fix warning when assing size_t type value to uv_buf_t.len, convert type to ↵ | George Zhao | 2018-01-18 | |
| | | | | | | | | | ULONG on Windows. | |||
| * | | Fix warning about conversion on mingw64 | George Zhao | 2018-01-18 | |
| | | | ||||
| * | | tui: final_column_wrap(): fix row calculation | Justin M. Keyes | 2018-01-16 | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | closes #7572 closes #7579 closes #7628 ASAN report: ==9500==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6040000024c0 at pc 0x00000187d2ca bp 0x7fc3c6e58d10 sp 0x7fc3c6e58d08 READ of size 8 at 0x6040000024c0 thread T1 0 0x187d2c9 in ugrid_put /home/vagrant/neovim/build/../src/nvim/ugrid.c:107:17 1 0x1850adf in tui_put /home/vagrant/neovim/build/../src/nvim/tui/tui.c:1012:10 2 0x18a6ce6 in ui_bridge_put_event /home/vagrant/neovim/build/src/nvim/auto/ui_events_bridge.generated.h:154:3 3 0xa4dcda in multiqueue_process_events /home/vagrant/neovim/build/../src/nvim/event/multiqueue.c:150:7 4 0xa478bf in loop_poll_events /home/vagrant/neovim/build/../src/nvim/event/loop.c:63:3 5 0x185451c in tui_main /home/vagrant/neovim/build/../src/nvim/tui/tui.c:362:12 6 0x18a3080 in ui_thread_run /home/vagrant/neovim/build/../src/nvim/ui_bridge.c:106:3 7 0x7fc3caaac6b9 in start_thread (/lib/x86_64-linux-gnu/libpthread.so.0+0x76b9) 8 0x7fc3c9ca33dc in clone /build/glibc-bfm8X4/glibc-2.23/misc/../sysdeps/unix/sysv/linux/x86_64/clone.S:109 0x6040000024c0 is located 0 bytes to the right of 48-byte region [0x604000002490,0x6040000024c0) allocated by thread T1 here: 0 0x50e048 in malloc (/home/vagrant/neovim/build/bin/nvim+0x50e048) 1 0xf7ab71 in try_malloc /home/vagrant/neovim/build/../src/nvim/memory.c:87:15 2 0xf7ad99 in xmalloc /home/vagrant/neovim/build/../src/nvim/memory.c:121:15 3 0x187937b in ugrid_resize /home/vagrant/neovim/build/../src/nvim/ugrid.c:32:17 4 0x184be58 in tui_resize /home/vagrant/neovim/build/../src/nvim/tui/tui.c:770:3 5 0x18a3dc8 in ui_bridge_resize_event /home/vagrant/neovim/build/src/nvim/auto/ui_events_bridge.generated.h:4:3 6 0xa4dcda in multiqueue_process_events /home/vagrant/neovim/build/../src/nvim/event/multiqueue.c:150:7 7 0xa478bf in loop_poll_events /home/vagrant/neovim/build/../src/nvim/event/loop.c:63:3 8 0x185451c in tui_main /home/vagrant/neovim/build/../src/nvim/tui/tui.c:362:12 9 0x18a3080 in ui_thread_run /home/vagrant/neovim/build/../src/nvim/ui_bridge.c:106:3 10 0x7fc3caaac6b9 in start_thread (/lib/x86_64-linux-gnu/libpthread.so.0+0x76b9) Thread T1 created by T0 here: 0 0x4655ed in __interceptor_pthread_create (/home/vagrant/neovim/build/bin/nvim+0x4655ed) 1 0x1ad87b0 in uv_thread_create /home/vagrant/neovim/.deps/build/src/libuv/src/unix/thread.c:75 2 0x184b9aa in tui_start /home/vagrant/neovim/build/../src/nvim/tui/tui.c:159:10 3 0x188dd4c in ui_builtin_start /home/vagrant/neovim/build/../src/nvim/ui.c:125:3 4 0xe6d399 in main /home/vagrant/neovim/build/../src/nvim/main.c:457:5 5 0x7fc3c9bbc82f in __libc_start_main /build/glibc-bfm8X4/glibc-2.23/csu/../csu/libc-start.c:291 | |||
| * | | tui: support TERM=konsole-256color | Justin M. Keyes | 2018-01-01 | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | TERM=konsole-256color is recognized by ncurses. TERM=konsole-xterm might be more clever, but should not be necessary (for Nvim at least), we already special-case Konsole in various places. We may need to clean up some areas that currently assume Konsole always "pretends xterm" (`TERM=xterm-256color`), though I didn't find any such cases. ref #6403 ref https://github.com/neovim/neovim/issues/6403#issuecomment-348713346 | |||
| * | | Merge branch 'master' into hide-container-impl | ZyX | 2017-12-23 | |
| |\ \ | ||||
| | * | | tui: rework deferred-termcodes ... again | Justin M. Keyes | 2017-12-16 | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - Revert timer-based approach. - Instead, call loop_poll_events() with a timeout in an "active" loop, to infer that "TUI startup activity has mostly finished", but also to enforce a mininum time (100 ms) before emitting "enable focus reporting" termcode. (If TUI startup takes longer than that minimum time, it's probably a slow environment anyways.) - Tickle `main_loop` by sending a dummy event. Without this, the initial "focus-gained" response from the terminal may not get processed until the user hits a key. ref #7720 ref #7664 ref #7649 ref #7664 ref 27f9b1c7b029d8 | |||
| * | | | Merge branch 'master' into hide-container-impl | ZyX | 2017-12-16 | |
| |\| | | ||||
| | * | | tui: defer termcodes using a timer | Justin M. Keyes | 2017-12-13 | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | With this implementation there is no "jank" during startup. Using the main_loop in any fashion is janky. Using only the TUI loop emits the termcodes too soon, or requires bad hacks like counting tui_flush invocations (9 seems to work). ref #7664 ref #7649 ref #7664 ref 27f9b1c7b029d8 | |||
| | * | | tui: rework deferred-termcodes implementation | Justin M. Keyes | 2017-12-13 | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Try another approach to defer the termcodes. Seems less janky, but still not perfect. ref #7664 ref #7649 ref #7664 ref 27f9b1c7b029d8 | |||
| | * | | ui: forward relevant option updates to UIs (#7520) | Björn Linse | 2017-12-12 | |
| | | | | | | | | | | also make termguicolors mutable after startup | |||