aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames McCoy <jamessan@jamessan.com>2020-07-31 01:41:59 -0400
committerJames McCoy <jamessan@jamessan.com>2020-07-31 17:59:33 -0400
commit3e3002b90c46fca8d8d5edebc021e56d95c5e645 (patch)
tree9ff1bc86a4bd1940fdbed12beffffd30dc9d22a3
parent9c4223215f71e1212462ada4e698be1b31437dd9 (diff)
downloadrneovim-3e3002b90c46fca8d8d5edebc021e56d95c5e645.tar.gz
rneovim-3e3002b90c46fca8d8d5edebc021e56d95c5e645.tar.bz2
rneovim-3e3002b90c46fca8d8d5edebc021e56d95c5e645.zip
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'
-rw-r--r--src/nvim/os/fs.c26
1 files changed, 19 insertions, 7 deletions
diff --git a/src/nvim/os/fs.c b/src/nvim/os/fs.c
index ae922e4040..6d76cc3613 100644
--- a/src/nvim/os/fs.c
+++ b/src/nvim/os/fs.c
@@ -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