Mercurial > vim
diff src/blob.c @ 30952:61558a67630a v9.0.0810
patch 9.0.0810: readblob() returns empty when trying to read too much
Commit: https://github.com/vim/vim/commit/5b2a3d77d320d76f12b1666938a9d58c2a848205
Author: Bram Moolenaar <Bram@vim.org>
Date: Fri Oct 21 11:25:30 2022 +0100
patch 9.0.0810: readblob() returns empty when trying to read too much
Problem: readblob() returns empty when trying to read too much.
Solution: Return what is available.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Fri, 21 Oct 2022 12:30:05 +0200 |
parents | 84f6f91ca02a |
children | 360f286b5869 |
line wrap: on
line diff
--- a/src/blob.c +++ b/src/blob.c @@ -199,24 +199,32 @@ read_blob(FILE *fd, typval_T *rettv, off if (offset >= 0) { - if (size == -1) + // The size defaults to the whole file. If a size is given it is + // limited to not go past the end of the file. + if (size == -1 || (size > st.st_size - offset +#ifdef S_ISCHR + && !S_ISCHR(st.st_mode) +#endif + )) // size may become negative, checked below size = st.st_size - offset; whence = SEEK_SET; } else { - if (size == -1) + // limit the offset to not go before the start of the file + if (-offset > st.st_size +#ifdef S_ISCHR + && !S_ISCHR(st.st_mode) +#endif + ) + offset = -st.st_size; + // Size defaults to reading until the end of the file. + if (size == -1 || size > -offset) size = -offset; whence = SEEK_END; } - // Trying to read bytes that aren't there results in an empty blob, not an - // error. - if (size <= 0 || ( -#ifdef S_ISCHR - !S_ISCHR(st.st_mode) && -#endif - size > st.st_size)) + if (size <= 0) return OK; if (offset != 0 && vim_fseek(fd, offset, whence) != 0) return OK;