children_kill_cb() is racey. One obvious problem is that
process_close_handles() is *queued* by on_process_exit(), so when
children_kill_cb() is invoked, the dead process might still be in the
`loop->children` list. If the OS already reclaimed the dead PID, Nvim
may try to SIGKILL it.
Avoid that by checking `proc->status`.
Vim doesn't have this problem because it doesn't attempt to kill
processes that ignored SIGTERM after a timeout.
closes#8269
Fixes#6890 by reading from the Windows console input buffer after
stdin has been closed.
Vim defines HAVE_DUP for Windows and does the close-dup dance[1]:
close(0);
dup(2);
which always fails, then falls back to reading from the Windows console
input buffer[2].
[1] e7499ddc33/src/fileio.c (L2397-L2398)
[2] e7499ddc33/src/os_win32.c (L1703-L1714)
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).
Any user can create a directory on root.
Creating a directory on root allows any user to write files within that directory.
Test_recover_root_dir() passes when run locally as a regular user (not admin).
Unset $SHELL so that child nvim use cmd.exe as default shell.
Unset $TERM so that child nvim don't segfault with negative exit code.
sh/bash use TERM=cygwin by default if it is unset.
mintty sets TERM to xterm.
The implementation of vim_fgets() differs between Neovim and Vim.
Vim says that it only returns `true` for EOF. But it always returns `true` when
fgets() returns NULL. This happens for EOF _or_ errors.
That probably misguided the author of Neovim's vim_fgets(), which does NOT
return `true` for errors.
Since all the callers of vim_fgets() probably expect it to work as it does in
Vim (and not as it says), it now returns the same values as the Vim
implementation.
Fixes#8227
Problem: Loading file type detection slows down startup.
Solution: Store the last pattern of an autocommand event to make appending
quicker.
462455ee8b
Problems:
- In two places in shada_read_when_writing() memory just was not freed. Both
places were verified to cause test failures.
- Numbered marks got assigned incorrect (off-by-one compared to position in the
array) numbers in replace_numbered_mark.
- It was possible to have non-continuously populated array of numbered marks
which messed up code for merging them.
(Note about tests: marks with additional data are always compared different when
merging, that caused some confusion regarding why test did not work the way
I expected.)