aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-02-28 19:23:28 +0800
committerzeertzjq <zeertzjq@outlook.com>2023-02-28 19:52:45 +0800
commit4bd0611d7b07b56fc5a9e121669a313166ba540f (patch)
tree9872da5aad04774dca33d95c6d42140a0c978af0 /src
parentbfa0bc7df0ca527fcec49dbd2055f1bac438663e (diff)
downloadrneovim-4bd0611d7b07b56fc5a9e121669a313166ba540f.tar.gz
rneovim-4bd0611d7b07b56fc5a9e121669a313166ba540f.tar.bz2
rneovim-4bd0611d7b07b56fc5a9e121669a313166ba540f.zip
vim-patch:9.0.0803: readblob() cannot read from character device
Problem: readblob() cannot read from character device. Solution: Use S_ISCHR() to not check the size. (Ken Takata, closes vim/vim#11407) https://github.com/vim/vim/commit/43625762a9751cc6e6e4d8f54fbc8b82d98fb20d S_ISCHR is always defined in Nvim. Co-authored-by: K.Takata <kentkt@csc.jp>
Diffstat (limited to 'src')
-rw-r--r--src/nvim/eval.c5
-rw-r--r--src/nvim/testdir/test_blob.vim5
2 files changed, 8 insertions, 2 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index c2f84735b2..92fd8a8de3 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -5893,10 +5893,11 @@ int read_blob(FILE *const fd, typval_T *rettv, off_T offset, off_T size_arg)
}
// Trying to read bytes that aren't there results in an empty blob, not an
// error.
- if (size < 0 || size > (off_T)os_fileinfo_size(&file_info)) {
+ if (size < 0 || (!S_ISCHR(file_info.stat.st_mode)
+ && size > (off_T)os_fileinfo_size(&file_info))) {
return OK;
}
- if (vim_fseek(fd, offset, whence) != 0) {
+ if (offset != 0 && vim_fseek(fd, offset, whence) != 0) {
return OK;
}
diff --git a/src/nvim/testdir/test_blob.vim b/src/nvim/testdir/test_blob.vim
index dd37fb2f11..5fc232119c 100644
--- a/src/nvim/testdir/test_blob.vim
+++ b/src/nvim/testdir/test_blob.vim
@@ -459,6 +459,11 @@ func Test_blob_read_write()
END
call CheckLegacyAndVim9Success(lines)
+ if filereadable('/dev/random')
+ let b = readblob('/dev/random', 0, 10)
+ call assert_equal(10, len(b))
+ endif
+
call assert_fails("call readblob('notexist')", 'E484:')
" TODO: How do we test for the E485 error?