aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/os/fs.c
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-03-10 16:58:01 +0800
committerGitHub <noreply@github.com>2024-03-10 16:58:01 +0800
commita441bdc936f9258851be3fa04c108c37e0a497ab (patch)
treea060f271a46efb8b3745e37e7166685722d7c71c /src/nvim/os/fs.c
parent8797429a7a5c6e01634a3bae328d07b62f2008f1 (diff)
downloadrneovim-a441bdc936f9258851be3fa04c108c37e0a497ab.tar.gz
rneovim-a441bdc936f9258851be3fa04c108c37e0a497ab.tar.bz2
rneovim-a441bdc936f9258851be3fa04c108c37e0a497ab.zip
vim-patch:9.1.0162: problem with writing extended attributes on failure (#27800)
Problem: problem with writing extended attributes on failure Solution: Change return type to ssize_t and check listxattr's return value correctly on failure (Paul Tagliamonte) The existing logic will return when the listxattr call returns with the errno set to ENOTSUP (or a size of 0 bytes), without checking to see if listxattr actually failed. listxattr can fail with at least E2BIG, ENOTSUP, ERANGE, or anything that `stat(2)` can fail with (in my case; ENOENT from stat). The returned size is stored to a size_t, but the return type is a ssize_t. On failure, listxattr returns -1, which will get translated to size_t's MAX. If the listxattr call failed with anything other than ENOTSUP, this triggers a request for size_t MAX bytes. This means that, if the listxattr call fails with anything other than ENOTSUP on save, vim will error with `E342: Out of memory! (allocating 18446744073709551615 bytes)` (keen observers will note 18446744073709551615 is 0xffffffffffffffff) In reality, this is likely masking a different (usually filesystem?) error -- but at least it's an error being pushed to the user now, and we don't try to allocate size_t MAX bytes. I've opted to change the type that we store listxattr to from size_t to ssize_t, to match listxattr(2)'s signature, and to check for the -1 return value. Additionally, I've removed the errno check -- if we get a listxattr failure for any reason, we may as well bail without trying; it's not like we can even recover. closes: vim/vim#14169 https://github.com/vim/vim/commit/14759ded57447345ba11c11a99fd84344797862c Co-authored-by: Paul R. Tagliamonte <paultag@gmail.com>
Diffstat (limited to 'src/nvim/os/fs.c')
-rw-r--r--src/nvim/os/fs.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/nvim/os/fs.c b/src/nvim/os/fs.c
index ade745df2c..85caf4aa43 100644
--- a/src/nvim/os/fs.c
+++ b/src/nvim/os/fs.c
@@ -789,7 +789,7 @@ void os_copy_xattr(const char *from_file, const char *to_file)
// get the length of the extended attributes
ssize_t size = listxattr((char *)from_file, NULL, 0);
// not supported or no attributes to copy
- if (errno == ENOTSUP || size <= 0) {
+ if (size <= 0) {
return;
}
char *xattr_buf = xmalloc((size_t)size);