fs: Ensure FileInfo struct is initialized

Zero out the caller's FileInfo in all the functions which populate the
struct.  The contents are considered private, so we need to ensure
it's initialized.

If the stat call fails, the buffer we get back from libuv may not have
any valid data in it, so don't copy it into the caller's FileInfo.

This was happening, expectedly, in functional/ex_cmds/write_spec.lua's
"write errors out correctly", which caused it to fail in certain
environments:

    test/functional/ex_cmds/write_spec.lua:130: Expected objects to be the same.
    Passed in:
    (string) 'Vim(write):E212: Can't open file for writing: not a directory'
    Expected:
    (string) 'Vim(write):E166: Can't open linked file for writing'
This commit is contained in:
James McCoy 2020-07-31 01:41:59 -04:00
parent 9c4223215f
commit 3e3002b90c
No known key found for this signature in database
GPG Key ID: DFE691AE331BA3DB

View File

@ -743,7 +743,9 @@ static int os_stat(const char *name, uv_stat_t *statbuf)
}
uv_fs_t request;
int result = uv_fs_stat(&fs_loop, &request, name, NULL);
*statbuf = request.statbuf;
if (result == kLibuvSuccess) {
*statbuf = request.statbuf;
}
uv_fs_req_cleanup(&request);
return result;
}
@ -1009,6 +1011,7 @@ int os_remove(const char *path)
bool os_fileinfo(const char *path, FileInfo *file_info)
FUNC_ATTR_NONNULL_ARG(2)
{
memset(file_info, 0, sizeof(*file_info));
return os_stat(path, &(file_info->stat)) == kLibuvSuccess;
}
@ -1020,14 +1023,17 @@ bool os_fileinfo(const char *path, FileInfo *file_info)
bool os_fileinfo_link(const char *path, FileInfo *file_info)
FUNC_ATTR_NONNULL_ARG(2)
{
memset(file_info, 0, sizeof(*file_info));
if (path == NULL) {
return false;
}
uv_fs_t request;
int result = uv_fs_lstat(&fs_loop, &request, path, NULL);
file_info->stat = request.statbuf;
bool ok = uv_fs_lstat(&fs_loop, &request, path, NULL) == kLibuvSuccess;
if (ok) {
file_info->stat = request.statbuf;
}
uv_fs_req_cleanup(&request);
return (result == kLibuvSuccess);
return ok;
}
/// Get the file information for a given file descriptor
@ -1039,10 +1045,16 @@ bool os_fileinfo_fd(int file_descriptor, FileInfo *file_info)
FUNC_ATTR_NONNULL_ALL
{
uv_fs_t request;
int result = uv_fs_fstat(&fs_loop, &request, file_descriptor, NULL);
file_info->stat = request.statbuf;
memset(file_info, 0, sizeof(*file_info));
bool ok = uv_fs_fstat(&fs_loop,
&request,
file_descriptor,
NULL) == kLibuvSuccess;
if (ok) {
file_info->stat = request.statbuf;
}
uv_fs_req_cleanup(&request);
return (result == kLibuvSuccess);
return ok;
}
/// Compare the inodes of two FileInfos