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 d1484f0..cd1dcf0 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -6148,59 +6148,83 @@
#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 6ac9000..acc535e 100644
--- a/src/version.c
+++ b/src/version.c
@@ -767,6 +767,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1620,
+/**/
1619,
/**/
1618,