fix(startup): report --startuptime error to stderr (#31131)

Problem:  Crash when initializing for --startuptime errors.
Solution: Report the error to stderr, as neither logging nor messages
          have been initialized yet.
This commit is contained in:
zeertzjq 2024-11-13 13:22:40 +08:00 committed by GitHub
parent 1128d75550
commit 17e00d0cc6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 21 additions and 3 deletions

View File

@ -956,7 +956,7 @@ void time_init(const char *fname, const char *proc_name)
const size_t bufsize = 8192; // Big enough for the entire --startuptime report. const size_t bufsize = 8192; // Big enough for the entire --startuptime report.
time_fd = fopen(fname, "a"); time_fd = fopen(fname, "a");
if (time_fd == NULL) { if (time_fd == NULL) {
semsg(_(e_notopen), fname); fprintf(stderr, _(e_notopen), fname);
return; return;
} }
startuptime_buf = xmalloc(sizeof(char) * (bufsize + 1)); startuptime_buf = xmalloc(sizeof(char) * (bufsize + 1));
@ -968,8 +968,7 @@ void time_init(const char *fname, const char *proc_name)
XFREE_CLEAR(startuptime_buf); XFREE_CLEAR(startuptime_buf);
fclose(time_fd); fclose(time_fd);
time_fd = NULL; time_fd = NULL;
ELOG("time_init: setvbuf failed: %d %s", r, uv_err_name(r)); fprintf(stderr, "time_init: setvbuf failed: %d %s", r, uv_err_name(r));
semsg("time_init: setvbuf failed: %d %s", r, uv_err_name(r));
return; return;
} }
fprintf(time_fd, "--- Startup times for process: %s ---\n", proc_name); fprintf(time_fd, "--- Startup times for process: %s ---\n", proc_name);

View File

@ -74,6 +74,25 @@ describe('startup', function()
assert_log("require%('vim%._editor'%)", testfile, 100) assert_log("require%('vim%._editor'%)", testfile, 100)
end) end)
it('--startuptime does not crash on error #31125', function()
eq(
"E484: Can't open file .",
fn.system({
nvim_prog,
'-u',
'NONE',
'-i',
'NONE',
'--headless',
'--startuptime',
'.',
'-c',
'42cquit',
})
)
eq(42, api.nvim_get_vvar('shell_error'))
end)
it('-D does not hang #12647', function() it('-D does not hang #12647', function()
clear() clear()
local screen local screen