# HG changeset patch # User Christian Brabandt # Date 1521546305 -3600 # Node ID 96de13023cadc3cd47bb78aa226f2d9293095c8c # Parent b774e8e6ea1d5c147a08758bd9e3fe719c51fb87 patch 8.0.1620: reading spell file has no good EOF detection commit https://github.com/vim/vim/commit/e26e0d2b83c2875b9829b884c2ababf8ca771f7e Author: Bram Moolenaar Date: Tue Mar 20 12:34:04 2018 +0100 patch 8.0.1620: reading spell file has no good EOF detection Problem: Reading spell file has no good EOF detection. Solution: Check for EOF at every character read for a length field. diff --git a/src/misc2.c b/src/misc2.c --- a/src/misc2.c +++ b/src/misc2.c @@ -6148,59 +6148,83 @@ filewritable(char_u *fname) #if defined(FEAT_SPELL) || defined(FEAT_PERSISTENT_UNDO) || defined(PROTO) /* * Read 2 bytes from "fd" and turn them into an int, MSB first. + * Returns -1 when encountering EOF. */ int get2c(FILE *fd) { - int n; + int c, n; n = getc(fd); - n = (n << 8) + getc(fd); - return n; + if (n == EOF) return -1; + c = getc(fd); + if (c == EOF) return -1; + return (n << 8) + c; } /* * Read 3 bytes from "fd" and turn them into an int, MSB first. + * Returns -1 when encountering EOF. */ int get3c(FILE *fd) { - int n; + int c, n; n = getc(fd); - n = (n << 8) + getc(fd); - n = (n << 8) + getc(fd); - return n; + if (n == EOF) return -1; + c = getc(fd); + if (c == EOF) return -1; + n = (n << 8) + c; + c = getc(fd); + if (c == EOF) return -1; + return (n << 8) + c; } /* * Read 4 bytes from "fd" and turn them into an int, MSB first. + * Returns -1 when encountering EOF. */ int get4c(FILE *fd) { + int c; /* Use unsigned rather than int otherwise result is undefined * when left-shift sets the MSB. */ unsigned n; - n = (unsigned)getc(fd); - n = (n << 8) + (unsigned)getc(fd); - n = (n << 8) + (unsigned)getc(fd); - n = (n << 8) + (unsigned)getc(fd); + c = getc(fd); + if (c == EOF) return -1; + n = (unsigned)c; + c = getc(fd); + if (c == EOF) return -1; + n = (n << 8) + (unsigned)c; + c = getc(fd); + if (c == EOF) return -1; + n = (n << 8) + (unsigned)c; + c = getc(fd); + if (c == EOF) return -1; + n = (n << 8) + (unsigned)c; return (int)n; } /* * Read 8 bytes from "fd" and turn them into a time_T, MSB first. + * Returns -1 when encountering EOF. */ time_T get8ctime(FILE *fd) { + int c; time_T n = 0; int i; for (i = 0; i < 8; ++i) - n = (n << 8) + getc(fd); + { + c = getc(fd); + if (c == EOF) return -1; + n = (n << 8) + c; + } return n; } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -767,6 +767,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1620, +/**/ 1619, /**/ 1618,