The `HASHTAB_ITER` logic keeps track of how many entries in the hash
table are left to visit, decrementing this on each iteration of the
loop. This was previously decremented at the end of the loop body:
```c
size_t hi##todo_ = hi##ht_->ht_used;
for (hashitem_T *hi = hi##ht_->ht_array; hi##todo_; hi++) {
if (!HASHITEM_EMPTY(hi)) {
{
<user code, macro-inserted>
}
hi##todo_--; // <--- important decrement here
}
}
```
This meant that if the body of the loop (substituted in via macro
expansion) contained a `continue` statement, we'd skip decrementing our
counter, meaning we'd iterate too many times over the hash table,
usually leading to an out of bounds read beyond the hash table's
memory, or uninitialised/null pointers from unused hash table slots.
Decrementing `hi##todo` before the arbitrary loop body protects us from
this, and has no adverse side-effects since only the macro code can (or
should) use this variable.
Before this commit, no code within `HASHTAB_ITER()` contained a
`continue`, meaning this bug was left dormant and the fix has a very
minimal chance of introducing any bugs.
Problem: Test42 seen as binary by git diff.
Solution: Add .gitattributes file. Make explicit that 'cpo' does not
contain 'S'. (Daniel Hahler, closesvim/vim#5072)
5b39d7adb0
Problem: Accessing uninitialized memory in test.
Solution: Check if there was a match before using the match position.
(Dominique Pelle, closesvim/vim#5088)
15ee567809
I/O in Catalina is currently known to be broken. This commit works around a pesky bug and also makes the code more consistent by removing the mix of C file and standard I/O.
Fixes https://github.com/neovim/neovim/issues/11196
Problem: Heredoc assignment has no room for new features. (FUJIWARA Takuya)
Solution: Require the marker does not start with a lower case character.
(closesvim/vim#4705)
2458200729
Problem: Script line numbers are not exactly right.
Solution: Handle heredoc and continuation lines better. (Ozaki Kiichi,
closesvim/vim#4611, closesvim/vim#4511)
bc2cfe4672
Problem: :let-heredoc does not trim enough.
Solution: Trim indent from the contents based on the indent of the first
line. Use let-heredoc in more tests.
e7eb92708e
Problem: The do_tag() function is too long.
Solution: Factor parts out to separate functions. Move simplify_filename()
to a file where it fits better. (Andy Massimino, closesvim/vim#4195)
b4a6020ac6
- Test fnamemodify()
- Test handling of `expand("%:e:e:r")`.
- Fix :e:e:r on filenames with insufficiently many extensions
During `fnamemodify()`, ensuring that we don't go before the filename's
tail is insufficient in cases where we've already handled a ":e"
modifier, for example:
```
"path/to/this.file.ext" :e:e:r:r
^ ^-------- *fnamep
+------------- tail
```
This means for a ":r", we'll go before `*fnamep`, and outside the bounds
of the filename. This is both incorrect and causes neovim to exit with
an allocation error.
We exit because we attempt to calculate `s - *fnamep` (line 23948).
Since `s` is before `*fnamep`, we caluclate a negative length, which
ends up being interpreted as an amount to allocate, causing neovim to
exit with ENOMEM (`memory.c:xmalloc`).
We must instead ensure we don't go before `*fnamep` nor `tail`.
The check for `tail` is still relevant, for example:
```
"path/to/this.file.ext" :r:r:r
^ ^------------- tail
+--------------------- *fnamep
```
Here we don't want to go before `tail`.
close#11165
When using TUI host terminal should take care of this (regardless
if 'termguicolors' is active or not). For GUI the behavior doesn't make
sense (GUI should display bold attr as bold always).
Problem: :digraph output is not easy to read.
Solution: Add highlighting for :digraphs. (Marcin Szamotulski, closesvim/vim#3572)
Also add section headers for :digraphs!.
eae8ae1b2b
Problem: Displayed digraph for "ga" wrong with 'encoding' "cp1251".
Solution: Convert from 'encoding' to "utf-8" if needed. (closesvim/vim#3015)
bc5020aa4d
Problem: Cannot recover from a swap file.
Solution: Do not expand environment variables in the swap file name.
Do not check the extension when we already know a file is a swap
file. (Ken Takata, closes 4415, closesvim/vim#4369)
99499b1c05