]> granicus.if.org Git - vim/commitdiff
patch 8.0.1620: reading spell file has no good EOF detection v8.0.1620
authorBram Moolenaar <Bram@vim.org>
Tue, 20 Mar 2018 11:34:04 +0000 (12:34 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 20 Mar 2018 11:34:04 +0000 (12:34 +0100)
Problem:    Reading spell file has no good EOF detection.
Solution:   Check for EOF at every character read for a length field.

src/misc2.c
src/version.c

index d1484f01fae64e772cc5cd9919b8f983e8b0f136..cd1dcf054a7fbb822499c901e30aca569d201cd1 100644 (file)
@@ -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;
 }
 
index 6ac9000dba0f500cf5f2a245c64362bb3adf826c..acc535e5cc397d8b2f282e1845f53275111deecc 100644 (file)
@@ -766,6 +766,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1620,
 /**/
     1619,
 /**/