Commit Graph

8855 Commits

Author SHA1 Message Date
zeertzjq
976db1ba4b vim-patch:9.2.0137: [security]: crash with composing char in collection range (#38261)
Problem:  Using a composing character as the end of a range inside a
          collection may corrupt the NFA postfix stack
          (Nathan Mills, after v9.1.0011)
Solution: When a character is used as the endpoint of a range, do not emit
          its composing characters separately. Range handling only uses
          the base codepoint.

supported by AI

Github Advisory:
https://github.com/vim/vim/security/advisories/GHSA-9phh-423r-778r

36d6e87542

Co-authored-by: Christian Brabandt <cb@256bit.org>
(cherry picked from commit e5667b9c15)
2026-03-12 01:35:01 +00:00
glepnir
9b13ee041f fix(api): nvim_set_hl crashes when url= key is passed
Problem: Calling nvim_set_hl() with url= crashes because it tries to
free arena-owned string memory.

Solution: Remove the bad free and return a validation error instead.
(cherry picked from commit d19dc6339d)
2026-03-06 11:43:01 +00:00
Stefan VanBuren
85d4822797 fix(treesitter): normalize language aliases
Hyphenated language names are silently dropped when used as injections
(see #38132).

This combines the normalization of language aliases into `resolve_lang`,
and also adds the normalization of hyphens to underscores, which allows
for handling of injected language tags with hyphens in their names.

Fixes #38132.

(cherry picked from commit 01817eb6f3)
2026-03-04 18:30:41 +00:00
zeertzjq
7fc228d94f vim-patch:9.2.0077: [security]: Crash when recovering a corrupted swap file (#38104)
Problem:  memline: a crafted swap files with bogus pe_page_count/pe_bnum
          values could cause a multi-GB allocation via mf_get(), and
          invalid pe_old_lnum/pe_line_count values could cause a SEGV
          when passed to readfile() (ehdgks0627, un3xploitable)
Solution: Add bounds checks on pe_page_count and pe_bnum against
          mf_blocknr_max before descending into the block tree, and
          validate pe_old_lnum >= 1 and pe_line_count > 0 before calling
          readfile().

Github Advisory:
https://github.com/vim/vim/security/advisories/GHSA-r2gw-2x48-jj5p

65c1a143c3

Co-authored-by: Christian Brabandt <cb@256bit.org>
(cherry picked from commit 7e8bdd348c)
2026-02-28 04:59:31 +00:00
zeertzjq
b9459fba26 vim-patch:9.2.0078: [security]: stack-buffer-overflow in build_stl_str_hl() (#38102)
Problem:  A stack-buffer-overflow occurs when rendering a statusline
          with a multi-byte fill character on a very wide terminal.
          The size check in build_stl_str_hl() uses the cell width
          rather than the byte length, allowing the subsequent fill
          loop to write beyond the 4096-byte MAXPATHL buffer
          (ehdgks0627, un3xploitable).
Solution: Update the size check to account for the byte length of
          the fill character (using MB_CHAR2LEN).

Github Advisory:
https://github.com/vim/vim/security/advisories/GHSA-gmqx-prf2-8mwf

4e5b9e31cb

Co-authored-by: Christian Brabandt <cb@256bit.org>
2026-02-28 11:37:11 +08:00
zeertzjq
de20500b40 vim-patch:9.2.0028: matchadd() conceal may use unrelated syntax cchar (#37974)
Problem:  matchadd() conceal may use unrelated syntax cchar.
Solution: Only use syntax cchar when syntax_flags has HL_CONCEAL
          (zeertzjq).

closes: vim/vim#19459

d01f234ec1
(cherry picked from commit 785ac9f228)
2026-02-19 23:31:23 +00:00
zeertzjq
f7af59d29b test(win_scrolled_resized_spec): fix flaky test (#37942)
(cherry picked from commit d23f28cca2)
2026-02-18 14:46:10 +00:00
zeertzjq
437f2e5a57 test(screen): fix minimal timeout too small for "intermediate" (#37933)
After #27620 flags.timeout is no longer used as the minimal timeout for
"intermediate", but the default minimal timeout shouldn't be too small.

(cherry picked from commit d0c699ec7b)
2026-02-18 12:18:09 +00:00
zeertzjq
f6bc9efe62 test: fix test failure causing following tests to fail (#37932)
(cherry picked from commit a520d9c4ea)
2026-02-18 10:17:38 +00:00
zeertzjq
b072f89d1e vim-patch:9.2.0004: Changing hidden prompt buffer cancels :startinsert/:stopinsert (#37881)
Problem:  Changing hidden prompt buffer cancels :startinsert/:stopinsert
          (after 9.0.1439).
Solution: Don't change mode for a prompt buffer in an autocommand
          window (zeertzjq).

closes: vim/vim#19410

8b81a6b6e1
(cherry picked from commit 7d8653575f)
2026-02-15 23:29:26 +00:00
zeertzjq
7bb3c3068c fix(highlight): setting 'winhl' doesn't work with global ns (#37868)
Problem:  Setting 'winhighlight' doesn't after setting global namespace
          using nvim_win_set_hl_ns().
Solution: Check if using another namespace when setting 'winhighlight'
          instead of disabling 'winhighlight' in nvim_win_set_hl_ns().
(cherry picked from commit f8d59cfab9)
2026-02-15 00:56:10 +00:00
glepnir
5c7a93917a test: move deprecated highlight API tests #37801
Problem: Tests for deprecated highlight API were mixed with current API tests.

Solution: Move them to deprecated_spec.lua and update highlight_spec.lua to use nvim_get_hl.
(cherry picked from commit 31c45f1aa4)
2026-02-15 00:30:10 +00:00
zeertzjq
7281cf883e fix(channel): possible hang after connecting with TCP times out (#37813)
Problem:  Possible hang after connecting with TCP times out.
Solution: Wait for the close callback to arrive.
2026-02-11 03:15:26 +00:00
zeertzjq
3a94763124 fix(channel): crash on failed sockconnect() (#37811)
Problem:  Crash on failed sockconnect() if a new connection is accepted
          while polling for uv events.
Solution: Don't use channel_destroy_early().

Also test "tcp" mode failure properly.

(cherry picked from commit 64ce5382bd)
2026-02-11 03:15:26 +00:00
zeertzjq
8fc81bc9e9 test: wait for uv.pipe_connect() callback (#37640)
Problem:
On Windows, writing to a pipe doesn't work if the pipe isn't connected
yet. This causes an RPC request to a session newly created by connect()
to hang, as it's waiting for a response to a request that never reaches
the server.

Solution:
Wait for uv.pipe_connect() callback to be called when using connect().
2026-02-11 03:15:26 +00:00
Sean Dewar
ddd7494ff9 test(terminal): skip flaky test on Windows (#37774)
Ref: https://github.com/neovim/neovim/pull/37758#discussion_r2778065203
(cherry picked from commit c90593ed5f)
2026-02-08 02:59:41 +00:00
zeertzjq
154f1c5abd test(api/server_requests_spec): fix flaky test (#37771)
Sometimes the scheduled :qall can arrive too late, so that EOF isn't
received in the same uv_run() call as the response.

(cherry picked from commit a9454f8511)
2026-02-08 01:18:45 +00:00
zeertzjq
79ed49cc69 vim-patch:9.1.2130: Page scrolling in Insert mode beeps (#37710)
Problem:  Page scrolling in Insert mode beeps (after 9.1.0211).
Solution: Fix incorrect return value of pagescroll(). Also invert the
          return value of scroll_with_sms() to be less confusing and
          match comments (zeertzjq).

fixes:  vim/vim#19326
closes: vim/vim#19327

a8ce914db1
(cherry picked from commit bdd886622d)
2026-02-07 15:54:31 +00:00
zeertzjq
5f6b195402 vim-patch:9.1.2136: :tab sbuffer may close old tabpage (#37765)
Problem:  :tab sbuffer may close old tabpage if BufLeave autocommand
          splits window (after 9.1.0143).
Solution: Only close other windows if the buffer will be unloaded
          (zeertzjq).

related: neovim/neovim#37749
closes: vim/vim#19352

6da9f757c4
(cherry picked from commit e704529909)
2026-02-07 15:54:06 +00:00
horrifyingHorse
37738d5ae0 fix(terminal): reset w_leftcol after resizing terminal
Problem: windows may scroll horizontally upon resize using the old terminal
size, which may be unnecessary and cause the content to be partially out-of-view.

Solution: reset the horizontal scroll after resizing.

Adjust expected highlights, as commit e946951f6a isn't backported.

(cherry picked from commit ba6440c106)
2026-02-06 16:37:43 +00:00
zeertzjq
03e68ad5d3 vim-patch:9.1.2133: Another case of buffer overflow with 'helpfile' (#37746)
Problem:  Another case of buffer overflow with 'helpfile'.
Solution: Leave room for "tags" in the buffer (zeertzjq).

closes: vim/vim#19340

21d591fb12
(cherry picked from commit 15061d322d)
2026-02-06 11:54:58 +00:00
zeertzjq
818b97173e fix(process): avoid buffering unnecessary UI event with PTY CWD (#37582)
Problem:
Calling os_chdir() to change the child processes' CWD may cause some
unnecessary UI events to be buffered. These UI events don't go anywhere
as execvp() is called before flushing the UI buffer.

Solution:
Use uv_chdir() instead of os_chdir(). Also fix getting error string
incorrectly. Add test for the current behavior.

(cherry picked from commit 6291256868)
2026-02-06 01:30:33 +00:00
Kevin Goodsell
c7f48e40b8 vim-patch:9.1.2119: tests: Test_language_cmd fails on OpenBSD (#37503)
Problem:  tests: Test_language_cmd fails on OpenBSD because the test
          uses an invalid locale name and expects the command to produce
          an error. OpenBSD accepts (almost) any locale name as valid by
          design, so the :lang command succeeds and the test fails.
Solution: Slightly update the "bad" locale name to make it something
          that OpenBSD considers invalid by adding a dot (but not ending
          with ".UTF-8"). Maintain the original two underscores in the
          name because that ensures Windows will also see it as invalid
          (Kevin Goodsell).

closes: vim/vim#19280

371583642a
(cherry picked from commit 5e1a3df5ae)
2026-02-06 01:21:36 +00:00
zeertzjq
151d6c7c41 test: add reasons to some skipped tests (#37632)
(cherry picked from commit 1e6c4ea896)
2026-02-06 01:17:06 +00:00
zeertzjq
3eef5752b3 fix(terminal): heap UAF if buffer deleted during TermRequest (#37612)
Problem:  Heap UAF if a terminal buffer is deleted during TermRequest in
          Normal mode.
Solution: Increment terminal refcount before triggering TermRequest, and
          destroy the terminal if the buffer is closed during that.
(cherry picked from commit b40880f88f)
2026-02-06 01:07:03 +00:00
zeertzjq
4792c29969 vim-patch:9.1.2132: [security]: buffer-overflow in 'helpfile' option handling (#37735)
Problem:  [security]: buffer-overflow in 'helpfile' option handling by
          using strcpy without bound checks (Rahul Hoysala)
Solution: Limit strncpy to the length of the buffer (MAXPATHL)

Github Advisory:
https://github.com/vim/vim/security/advisories/GHSA-5w93-4g67-mm43

0714b15940

Co-authored-by: Christian Brabandt <cb@256bit.org>
(cherry picked from commit db133879b2)
2026-02-06 00:06:46 +00:00
zeertzjq
a3c8c593f2 test(terminal/cursor_spec): fix flaky test (#37715)
Problem:  Cursor visibility test may fail if the :sleep lasts too long.
Solution: Wait for the TermLeave autocommand to finish.
(cherry picked from commit b95e0a8d20)
2026-02-05 07:12:35 +00:00
zeertzjq
ba7456b91a test(terminal/cursor_spec): fix flaky test (#37681)
(cherry picked from commit 963162b338)
2026-02-05 07:02:49 +00:00
Sean Dewar
d47d317a79 vim-patch:9.1.2128: Heap use after free in buf_check_timestamp()
Problem:  heap UAF if autocommands from reloading a file changed outside
          of Vim wipe its buffer.
Solution: Validate the bufref after buf_reload (Sean Dewar)

closes: vim/vim#19317

392b428d12

Co-authored-by: Sean Dewar <6256228+seandewar@users.noreply.github.com>
(cherry picked from commit fede568692)
2026-02-04 12:09:02 +00:00
phanium
b1f2fe46cd fix: lsp.enable() don't work correctly inside FileType event #37538
Problem:
Two cases lsp.enable() won't work in the first FileType event
1. lsp.enable luals inside FileType or ftplugin/lua.lua, then:
```
nvim a.lua
```

2. lsp.enable luals inside FileType or ftplugin/lua.lua, then:
```
nvim -> :edit a.lua -> :mksession! | restart +qa! so Session.vim
```

Solution:
Currently `v:vim_did_enter` is used to detected two cases:
1. "maunally enabled" (lsp.enable() or `:lsp enable`)
2. "inside FileType event"

To detect 2. correctly we use did_filetype().

(cherry picked from commit fd45bc8cab)
2026-01-27 23:21:22 +00:00
zeertzjq
0da1e4b1c5 vim-patch:9.1.2107: :normal may change cmdline history (#37523)
Problem:  :normal may change cmdline history if the keys don't
          explicitly leave Cmdline mode (after 9.1.1872).
Solution: Check ex_normal_busy (zeertzjq)

closes: vim/vim#19237

85241020e8
(cherry picked from commit f10a1dcf4d)
2026-01-24 01:47:39 +00:00
zeertzjq
0b1f5a1d60 vim-patch:9.1.2105: tests: not enough tests for using plain_vgetc() (#37521)
Problem:  Not enough tests for using plain_vgetc().
Solution: Add tests for using plain_vgetc() during various commands.
          (zeertzjq)

closes: vim/vim#19236

2b6bdbc697
(cherry picked from commit e0b724de09)
2026-01-24 00:59:54 +00:00
zeertzjq
9a50420461 vim-patch:9.1.1872: Cmdline history not updated when mapping <Up> and <CR> (#36334)
Problem:  Cmdline history not updated when mapping both <Up> and <CR>.
Solution: Consider the command typed when in Cmdline mode and there is
          no pending input (zeertzjq).

Although the existing behavior technically does match documentation, the
"completely come from mappings" part is a bit ambiguous, because one may
argue that the command doesn't completely come from mappings as long as
the user has typed a key in Cmdline mode.  I'm not entirely sure if this
change will cause problems, but it seems unlikely.

fixes: vim/vim#2771
related: neovim/neovim#36256
closes: vim/vim#18607

97b6e8b424
(cherry picked from commit 2407833ba1)
2026-01-23 23:54:40 +00:00
zeertzjq
4b41c284ed fix(terminal): <Ignore> should be no-op (#37494)
(cherry picked from commit 196df35cca)
2026-01-22 01:58:47 +00:00
zeertzjq
40c974e689 fix(terminal): restore options properly when switching buffer (#37485)
(cherry picked from commit 25ce44845d)
2026-01-21 11:19:30 +00:00
zeertzjq
9ba985c250 test: add tests for #14379 2026-01-20 07:39:21 +08:00
zeertzjq
537e8d69f8 vim-patch:9.1.2095: :wqall! doesn't quit when using :quit in BufWritePost
Problem:  :wqall! doesn't quit when using :quit in BufWritePost
          (after 8.0.1190).
Solution: Restore old value of "exiting" when calling not_exiting()
          instead of always resetting it to FALSE (zeertzjq).

related: vim/vim#2205
closes:  vim/vim#19212

e803ad1c56
2026-01-20 07:39:21 +08:00
Emanuel Krollmann
a512d43716 fix(autocmd): heap UAF with :bwipe in Syntax autocmd
Problem:
Creating an autocommand which executes `:bwipe` on the Syntax event
causes a heap-use-after-free.

Solution: set BF_SYN_SET flag before applying autocommands
(cherry picked from commit f36dd7557a)
2026-01-18 18:23:15 +00:00
zeertzjq
6ef1b655fe fix(normal): assertion failure with "gk" in narrow window (#37444)
When width1 and width2 are negative the assertion may fail. It seems
that adding a negative value to w_curswant won't cause any problems, so
just change the assertion.

(cherry picked from commit 41068c77aa)
2026-01-18 04:10:59 +00:00
Sean Dewar
1db945b584 fix(api): parse_expression crash with unopened ] and node
Problem: nvim_parse_expression null pointer dereference with unmatched ]
followed by a node.

Solution: if ast_stack was empty, set new_top_node_p to top of the stack after
pushing the list literal node; similar to what's done for curlies.

This bug was originally found by a Matrix user, but I couldn't remember how to
trigger it... Ran into the other crash while finding a repro. :P

(cherry picked from commit a5e5ec8910)
2026-01-17 13:48:49 +00:00
Sean Dewar
92849eacff fix(api): parse_expression crash with ident and curly
Problem: nvim_parse_expression null pointer dereference when parsing an
identifier followed by { with "highlight" parameter set to false.

Solution: only set opening_hl_idx if pstate->colors is not NULL.

Not added to parser_tests.lua as that uses highlight = true.

(cherry picked from commit 5226801be2)
2026-01-17 13:48:49 +00:00
zeertzjq
0cc15be15d vim-patch:9.1.2087: Crash when using :tabonly in BufUnload
Problem:  Crash when using :tabonly in BufUnload.
Solution: Set curbuf when setting curwin->w_buffer. Don't wipe out a
          buffer if there are no other buffers. Don't decrement
          b_nwindows if it was 0 before buf_freeall() (zeertzjq).

fixes:  vim/vim#19088#issuecomment-3710172769
closes: vim/vim#19186

fa64f92f6a
(cherry picked from commit eb5a7cc0dd)
2026-01-17 11:40:16 +00:00
zeertzjq
1e001b5c8d test: remove duplicate test (#37434)
This test is a copy of Test_bufunload_all() and requires too much
additional cleanup for the Windows log message.

(cherry picked from commit 8754118213)
2026-01-17 01:36:45 +00:00
Sean Dewar
600d9f35a4 vim-patch:9.1.2086: Memory leak when skipping invalid literal dict
Problem:  memory leak when not evaluating (just parsing) invalid literal
          dict.
Solution: Always clear the key's typval (Sean Dewar)

Though "check_typval_is_value(&tv) == FAIL && !evaluate" is maybe never
true, also always clear tvs if check_typval_is_value fails; at worst
this would be a no-op as their initial types are VAR_UNKNOWN.

closes: vim/vim#19178

b10a3e1a20

check_typval_is_value change is for Vim9 script. (from 9.0.2163)

N/A patch:
vim-patch:9.0.2163: Vim9: type can be assigned to list/dict

Co-authored-by: Sean Dewar <6256228+seandewar@users.noreply.github.com>
(cherry picked from commit ba1d50fdc3)
2026-01-16 00:02:51 +00:00
Sean Dewar
10a1df2789 fix(api): nvim_get_option_value dummy buffer crashes
Problem: nvim_get_option_value with "filetype" set can crash if autocommands
open the dummy buffer in more windows, or if &bufhidden == "wipe".

Solution: Attempt to close all dummy buffer windows before wiping. Promote the
dummy buffer to a normal buffer if that fails.

(cherry picked from commit 7e2e116343)
2026-01-15 23:19:44 +00:00
Sean Dewar
6ce7b9b851 fix(api): autocmds mess up nvim_get_option_value's dummy buffer
Problem: When the "filetype" key is set for nvim_get_option_value, autocommands
can crash Nvim by prematurely wiping the dummy buffer, or cause options intended
for it to instead be set for unrelated buffers if switched during OptionSet.

Solution: Don't crash. Also quash side-effects from setting the buffer options.
(cherry picked from commit 3cb462a960)
2026-01-15 23:19:44 +00:00
zeertzjq
c469cba162 fix(channel): unreference list after callback finishes (#37358) 2026-01-12 08:36:14 +08:00
zeertzjq
f21c169a02 fix(lua): vim._with() doesn't save boolean options properly (#37354)
Problem:  vim._with() doesn't save boolean options with false values
          properly.
Solution: Use vim.F.if_nil().
(cherry picked from commit 94144d4678)
2026-01-11 12:30:12 +00:00
zeertzjq
2a3cd8dc80 fix(rpc): don't overwrite already received results on error (#37339)
This fixes a regression from cf6f60ce4d
(possibly), as before that commit a frame is popped from the call stack
immediately after its response is received.

Also fix leaking the allocated error messages.

(cherry picked from commit 39d8aa0a1a)
2026-01-11 10:49:03 +00:00
zeertzjq
ba600c495f fix(session): window sizes not stored with float windows (#37344)
(cherry picked from commit 2d3dc070ce)
2026-01-10 15:15:48 +00:00