mirror of
https://github.com/neovim/neovim.git
synced 2025-09-28 22:18:33 +00:00
vim-patch:7.4.1975
Problem: On MS-Windows large files (> 2Gbyte) cause problems.
Solution: Use "off_T" instead of "off_t". Use "stat_T" instead of "struct
stat". Use 64 bit system functions if available. (Ken Takata)
8767f52fbf
Only the off_T changes are relevant, since all the "struct stat" usage
is abstracted by libuv.
This commit is contained in:
@@ -115,18 +115,18 @@ memfile_T *mf_open(char_u *fname, int flags)
|
||||
}
|
||||
}
|
||||
|
||||
off_t size;
|
||||
off_T size;
|
||||
|
||||
// When recovering, the actual block size will be retrieved from block 0
|
||||
// in ml_recover(). The size used here may be wrong, therefore mf_blocknr_max
|
||||
// must be rounded up.
|
||||
if (mfp->mf_fd < 0
|
||||
|| (flags & (O_TRUNC|O_EXCL))
|
||||
|| (size = lseek(mfp->mf_fd, (off_t)0L, SEEK_END)) <= 0) {
|
||||
|| (size = vim_lseek(mfp->mf_fd, 0L, SEEK_END)) <= 0) {
|
||||
// no file or empty file
|
||||
mfp->mf_blocknr_max = 0;
|
||||
} else {
|
||||
assert(sizeof(off_t) <= sizeof(blocknr_T)
|
||||
assert(sizeof(off_T) <= sizeof(blocknr_T)
|
||||
&& mfp->mf_page_size > 0
|
||||
&& mfp->mf_page_size - 1 <= INT64_MAX - size);
|
||||
mfp->mf_blocknr_max = (((blocknr_T)size + mfp->mf_page_size - 1)
|
||||
@@ -689,9 +689,9 @@ static int mf_read(memfile_T *mfp, bhdr_T *hp)
|
||||
return FAIL;
|
||||
|
||||
unsigned page_size = mfp->mf_page_size;
|
||||
// TODO(elmart): Check (page_size * hp->bh_bnum) within off_t bounds.
|
||||
off_t offset = (off_t)(page_size * hp->bh_bnum);
|
||||
if (lseek(mfp->mf_fd, offset, SEEK_SET) != offset) {
|
||||
// TODO(elmart): Check (page_size * hp->bh_bnum) within off_T bounds.
|
||||
off_T offset = (off_T)(page_size * hp->bh_bnum);
|
||||
if (vim_lseek(mfp->mf_fd, offset, SEEK_SET) != offset) {
|
||||
PERROR(_("E294: Seek error in swap file read"));
|
||||
return FAIL;
|
||||
}
|
||||
@@ -716,7 +716,7 @@ static int mf_read(memfile_T *mfp, bhdr_T *hp)
|
||||
/// - Write error in swap file.
|
||||
static int mf_write(memfile_T *mfp, bhdr_T *hp)
|
||||
{
|
||||
off_t offset; // offset in the file
|
||||
off_T offset; // offset in the file
|
||||
blocknr_T nr; // block nr which is being written
|
||||
bhdr_T *hp2;
|
||||
unsigned page_size; // number of bytes in a page
|
||||
@@ -745,9 +745,9 @@ static int mf_write(memfile_T *mfp, bhdr_T *hp)
|
||||
hp2 = hp;
|
||||
}
|
||||
|
||||
// TODO(elmart): Check (page_size * nr) within off_t bounds.
|
||||
offset = (off_t)(page_size * nr);
|
||||
if (lseek(mfp->mf_fd, offset, SEEK_SET) != offset) {
|
||||
// TODO(elmart): Check (page_size * nr) within off_T bounds.
|
||||
offset = (off_T)(page_size * nr);
|
||||
if (vim_lseek(mfp->mf_fd, offset, SEEK_SET) != offset) {
|
||||
PERROR(_("E296: Seek error in swap file write"));
|
||||
return FAIL;
|
||||
}
|
||||
|
Reference in New Issue
Block a user