aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAge
...
* | vim-patch:8.0.0672: synconcealed() changes too often #7887nate2018-02-01
| | | | | | | | | | | | | | | | Problem: Third item of synconcealed() changes too often. (Dominique Pelle) Solution: Reset the sequence number at the start of each line. https://github.com/vim/vim/commit/cc0750dc6e878394ab0fd922b7ea4280918ae406 closes #7589
* | tui: libtermkey: force CSI driver for mouse input #7948Chih-Hsuan Yen2018-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.
* | clipboard: macOS: fallback to tmux if pbcopy is broken #7940Justin M. Keyes2018-01-31
| | | | | | | | | | | | | | | | On some versions of macOS, pbcopy doesn't work in tmux <2.6 https://superuser.com/q/231130 Fallback to tmux in that case. Add a healthcheck for this scenario.
* | vim-patch:8.0.0358,8.0.0359 (#7832)KunMing Xie2018-01-30
| | | | | | | | | | | | | | | | | | | | | | | | | | vim-patch:8.0.0358: invalid memory access in C-indent code Problem: Invalid memory access in C-indent code. Solution: Don't go over end of empty line. (Dominique Pelle, closes vim/vim#1492) https://github.com/vim/vim/commit/60629d642541a089c322e65963c0a77e5f77eb79 vim-patch:8.0.0359: 'number' and 'relativenumber' are not properly tested Problem: 'number' and 'relativenumber' are not properly tested. Solution: Add tests, change old style to new style tests. (Ozaki Kiichi, closes vim/vim#1447) https://github.com/vim/vim/commit/dc9a081712ec8c140e6d4909e9f6b03a629d32d3
* | win: has("wsl") on Windows Subsystem for Linux #7330Mahmoud Al-Qudsi2018-01-30
| | | | | | | | | | | | | | | | | | | | | | | | | | Per CMAKE docs, CMAKE_HOST_SYSTEM_VERSION is the result of `uname -r`: https://cmake.org/cmake/help/v3.4/variable/CMAKE_HOST_SYSTEM_VERSION.html?highlight=uname A numeric version string for the system. On systems that support uname, this variable is set to the output of uname -r. On other systems this is set to major-minor version numbers. On Windows it is something like "6.1", so it won't match ".*-Microsoft". Closes #7329
* | vim-patch:8.0.0448: some macros are lower case (#7936)KunMing Xie2018-01-30
| | | | | | | | | | | | | | Problem: Some macros are in lower case, which can be confusing. Solution: Make a few lower case macros upper case. https://github.com/vim/vim/commit/b5aedf3e228d35821591da9ae8501b61cf2e264c ref #6297
* | vim-patch:8.0.0443: terminal width is set to 80 in test3 (#7933)KunMing Xie2018-01-30
| | | | | | | | | | | | | | Problem: Terminal width is set to 80 in test3. Solution: Instead of setting 'columns' set 'wrapmargin' depending on 'columns. https://github.com/vim/vim/commit/38a3d6c9601b637a28f399059263300e9f65eba4
* | Merge #5822 'mouse.c: Fix mouse click on multibyte + concealed'Justin M. Keyes2018-01-29
|\ \
| * | Updated testsTommy Allen2018-01-28
| | |
| * | Safer loop for skipping consecutive concealed charsTommy Allen2018-01-28
| | |
| * | Use one variable for tracking adjustment instead of twoTommy Allen2018-01-28
| | |
| * | Adjust cursor according to character display widthsTommy Allen2018-01-28
| | |
| * | Don't move cursor to the left if on the first column of wrapped lineTommy Allen2018-01-28
| | | | | | | | | | | | ref: #7887
| * | Use utfc_ptr2len instead of utf_ptr2lenTommy Allen2018-01-28
| | |
| * | mouse.c: Fix mouse click on lines with multibyte textTommy Allen2018-01-28
| | | | | | | | | | | | fixes #5341, #5801
* | | dist: snap packaging #7918Christian Dywan2018-01-29
| | |
* | | Merge #7842 'win: fnamemodify()'Justin M. Keyes2018-01-29
|\ \ \ | |/ / |/| |
| * | test: use helpers.pathroot() to avoid a syscallJan Edmund Lazo2018-01-29
| | |
| * | test: osx: try resolve($TMPDIR)Jan Edmund Lazo2018-01-28
| | |
| * | test: fix failed tests with $TMPDIR in QuickBuildJan Edmund Lazo2018-01-28
| | |
| * | Revert "test: fix failed test cases with tmpdir = $TMPDIR"Jan Edmund Lazo2018-01-28
| | | | | | | | | | | | | | | | | | | | | This reverts commit f7fe3012204169f22412194a78f196ffc72bb8c3. Fails on QuickBuild because it uses a non-local path. Need a environment-agnostic solution
| * | test: fix failed test cases with tmpdir = $TMPDIRJan Edmund Lazo2018-01-28
| | |
| * | test: try $TMPDIR for temporary directoryJan Edmund Lazo2018-01-28
| | |
| * | test: fnamemodify with :8 filename modifierJan Edmund Lazo2018-01-28
| | |
| * | win: enable legacy/fnamemodify_spec.luaJan Edmund Lazo2018-01-28
| | |
| * | fixup: get network drive only, not entire pathJan Edmund Lazo2018-01-28
| | |
| * | fixup: lint errorsJan Edmund Lazo2018-01-28
| | |
| * | test: win: get current network drive via io.popenJan Edmund Lazo2018-01-28
| | |
| * | win: explicitly specify pathsepJan Edmund Lazo2018-01-28
| | |
| * | fixup: compile-time errorsJan Edmund Lazo2018-01-28
| | |
| * | win: detect / and \ as root path separatorJan Edmund Lazo2018-01-28
| | |
| * | test: win: add tests for shellslashJan Edmund Lazo2018-01-28
| | |
| * | test: fnamemodify()Justin M. Keyes2018-01-28
| | |
* | | vim-patch:8.0.0528: highlight wrong text when 'wim' includes "longest" (#7927)Jakub Łuczyński2018-01-29
| | | | | | | | | | | | | | | | | | | | | | | | Problem: When 'wildmenu' is set and 'wildmode' has "longest" then the first file name is highlighted, even though the text shows the longest match. Solution: Do not highlight the first match. (LemonBoy, closes vim/vim#1602) https://github.com/vim/vim/commit/ef8eb0897819099fb00d675afb9bffe1d008c45e
* | | vim-patch:8.0.0427: 'makeencoding' missing from the options window (#7907)KunMing Xie2018-01-28
| | | | | | | | | | | | | | | Problem: 'makeencoding' missing from the options window. Solution: Add the entry. https://github.com/vim/vim/commit/ad4187e6fc9c8e1083a172852d958a70a689a75c
* | | Merge #7924 'test/old: various fixes'Justin M. Keyes2018-01-28
|\ \ \ | |/ / |/| |
| * | test/old: fix Test_set_completion()Justin M. Keyes2018-01-28
| | | | | | | | | | | | | | | | | | Vim's src/testdir has more directories in it, so the "./samples/" item happens to have a space in front of it. This isn't relevant to the test, so just elide the space for our case.
| * | test/old: $TMPDIR must be absoluteJustin M. Keyes2018-01-28
| | | | | | | | | | | | | | | Internals `chdir` here and there, this causes relative $TMPDIR to break some things. Don't know why this only happened on macOS...
| * | ex_diffpatch: don't need redraw_later(CLEAR), Nvim uses pipesJustin M. Keyes2018-01-28
| | |
* | | test/win: fix some environment assumptions #7912George Zhao2018-01-28
|/ / | | | | | | | | fix #7909 fix #7910
* | Merge #7903 'test/old: minor fixes for local invocation'Justin M. Keyes2018-01-28
|\ \
| * | test/old: always set $TMPDIRJustin M. Keyes2018-01-23
| | | | | | | | | | | | | | | | | | On macOS $TMPDIR defaults to something very long. There's not really a need to support overriding the $TMPDIR used by tests, so always use the workspace-local path "Xtest-tmpdir".
| * | test/old: Fix_truncated_tmpfile(): more flexibleJustin M. Keyes2018-01-23
| | |
* | | tui: fix use-after-free after UI `stop` event #7922Justin M. Keyes2018-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);
* | | Merge #7919 from hardenedapple/langremap-after-mapJustin M. Keyes2018-01-27
|\ \ \ | |_|/ |/| |
| * | Make 'langnoremap' apply directly after a mapMatthew Malcomson2018-01-27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We were initially checking whether to apply 'langmap' translation based on typebuf.tb_maplen. This gets set to 0 on the last byte of a map when the del_typebuf() function is called, which means that the option was not working for the last character of a mapping. For this reason, we switched to using KeyTyped to decide whether to apply the transformation or not in commit 53da57d27. Substituting one for the other isn't enough, because KeyTyped isn't set until vgetorpeek() is returning. This means 'langmap' translations are not applied when searching for characters to map in the vgetorpeek() function if the *previous* key was not typed. We can't assert that both hold, as we would then *not* apply the transformation when looking for a map starting with the first typed key after a previously expanded map (as KeyTyped would be `false` from the previously expanded map, and not yet reset). Hence we assert that if we are looking for the mapping while in vgetorpeek(), the map length should be zero, otherwise, KeyTyped must be `true`. This is implemented by checking for the variable `vgetc_busy`.
| * | Add some tests for 'langmap'Matthew Malcomson2018-01-27
| | |
* | | build/macOS: remove -iframework line #7891Justin M. Keyes2018-01-26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Linker error: [1/3] Linking C executable bin/nvim ld: warning: directory not found for option '-FCoreFoundation' Only the -isysroot change is needed, see https://github.com/neovim/neovim/pull/7891#discussion_r164036958
* | | Merge pull request #6558 from jamessan/tv_as_string-fixJames McCoy2018-01-25
|\ \ \ | | | | | | | | eval: save_tv_as_string: Correctly handle an empty string
| * | | eval: save_tv_as_string: Correctly handle an empty stringJames McCoy2018-01-23
| | |/ | |/| | | | | | | | | | | | | | | | | | | When tv_get_string_chk returns a non-NULL value, we have a valid string. Propagating an error state (*len = -1, NULL return) for an empty string is invalid. Closes #6554