From: Bram Moolenaar Date: Tue, 20 Mar 2018 11:34:04 +0000 (+0100) Subject: patch 8.0.1620: reading spell file has no good EOF detection X-Git-Tag: v8.0.1620 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e26e0d2b83c2875b9829b884c2ababf8ca771f7e;p=vim 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 index d1484f01f..cd1dcf054 100644 --- 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 index 6ac9000db..acc535e5c 100644 --- a/src/version.c +++ b/src/version.c @@ -766,6 +766,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1620, /**/ 1619, /**/