From c1479920cb39b85e9dc4993c9c425dae8a22acb1 Mon Sep 17 00:00:00 2001 From: Aikar Date: Sat, 11 Aug 2018 00:49:20 -0400 Subject: [PATCH] Detect and repair corrupt Region Files If the file has partial data written but not the full 8192 bytes, then the server will be unable to load that region file... I don't know why mojang only checks for 4096, when anything less than 8192 is a crash. But to be safe, it will attempt to back up the file. diff --git a/src/main/java/net/minecraft/server/RegionFile.java b/src/main/java/net/minecraft/server/RegionFile.java index 5d2853b9ce..c35974aa7c 100644 --- a/src/main/java/net/minecraft/server/RegionFile.java +++ b/src/main/java/net/minecraft/server/RegionFile.java @@ -40,7 +40,20 @@ public class RegionFile { } this.c = new RandomAccessFile(file1, "rw"); - if (this.c.length() < 4096L) { + // Paper start - detect and fix incomplete headers + long length = this.c.length(); + if (length < 8192 && length > 0) { + File corrupt = new File(file1.getParentFile(), file1.getName() + ".bak"); + org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager.getLogger(); + logger.error("Region file " + file1 + " was incomplete. Backing up to " + corrupt + " and repairing"); + try { + java.nio.file.Files.copy(file1.toPath(), corrupt.toPath()); + } catch (IOException e) { + logger.error("Error backing up corrupt file", e); + } + } + if (length < 8192L) { + // Paper end this.c.write(a); this.c.write(a); this.g += 8192; -- 2.19.0