diff --git a/src/memline.c b/src/memline.c
index bb1126de107e81740c4bd44f4f33f0959f251e32..cd39e0617250983e469a7882e78fdb1a170d13f8 100644
--- a/src/memline.c
+++ b/src/memline.c
@@ -1015,18 +1015,39 @@ ml_recover()
 	msg_end();
 	goto theend;
     }
+
     /*
      * If we guessed the wrong page size, we have to recalculate the
      * highest block number in the file.
      */
     if (mfp->mf_page_size != (unsigned)char_to_long(b0p->b0_page_size))
     {
+	unsigned previous_page_size = mfp->mf_page_size;
+
 	mf_new_page_size(mfp, (unsigned)char_to_long(b0p->b0_page_size));
+	if (mfp->mf_page_size < previous_page_size)
+	{
+	    msg_start();
+	    msg_outtrans_attr(mfp->mf_fname, attr | MSG_HIST);
+	    MSG_PUTS_ATTR(_(" has been damaged (page size is smaller than minimum value).\n"),
+			attr | MSG_HIST);
+	    msg_end();
+	    goto theend;
+	}
 	if ((size = lseek(mfp->mf_fd, (off_t)0L, SEEK_END)) <= 0)
 	    mfp->mf_blocknr_max = 0;	    /* no file or empty file */
 	else
 	    mfp->mf_blocknr_max = (blocknr_T)(size / mfp->mf_page_size);
 	mfp->mf_infile_count = mfp->mf_blocknr_max;
+
+	/* need to reallocate the memory used to store the data */
+	p = alloc(mfp->mf_page_size);
+	if (p == NULL)
+	    goto theend;
+	mch_memmove(p, hp->bh_data, previous_page_size);
+	vim_free(hp->bh_data);
+	hp->bh_data = p;
+	b0p = (ZERO_BL *)(hp->bh_data);
     }
 
 /*
diff --git a/src/version.c b/src/version.c
index 672a409e06146615a161abaf15ad29b2bb7b7deb..d7c6b29344f6db193af30f4b034d827f8d948ddf 100644
--- a/src/version.c
+++ b/src/version.c
@@ -666,6 +666,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    231,
 /**/
     230,
 /**/