From 760b0e35df25cb0b35e9ef0fa5ee1d6881ae7cf4 Mon Sep 17 00:00:00 2001 From: Lukas Rieger Date: Sun, 13 Sep 2026 11:22:10 +0200 Subject: [PATCH] fix: Fix Compression-Stream not being closed and not releasing resources correctly --- .../net/pl3x/map/core/world/ChunkLoader.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/net/pl3x/map/core/world/ChunkLoader.java b/core/src/main/java/net/pl3x/map/core/world/ChunkLoader.java index 9d9a78912..58a0dbca8 100644 --- a/core/src/main/java/net/pl3x/map/core/world/ChunkLoader.java +++ b/core/src/main/java/net/pl3x/map/core/world/ChunkLoader.java @@ -29,6 +29,7 @@ import de.bluecolored.bluenbt.TypeToken; import java.io.BufferedInputStream; import java.io.FileInputStream; +import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; @@ -81,15 +82,17 @@ public Chunk load(RandomAccessFile raf, long offset, int index) throws IOExcepti // optimistic: try last used version ChunkVersionLoader usedLoader = lastUsedLoader; Chunk chunk; - InputStream decompressedIn = new BufferedInputStream(compression.decompress(new FileInputStream(raf.getFD()))); - chunk = usedLoader.load(world, region, decompressedIn, index); + try (InputStream decompressedIn = new BufferedInputStream(compression.decompress(nonClosing(new FileInputStream(raf.getFD()))))) { + chunk = usedLoader.load(world, region, decompressedIn, index); + } // check version and reload chunk if the wrong loader has been used and a better one has been found ChunkVersionLoader actualLoader = findBestLoaderForVersion(chunk.getDataVersion()); if (actualLoader != null && usedLoader != actualLoader) { raf.seek(offset + 5); - decompressedIn = new BufferedInputStream(compression.decompress(new FileInputStream(raf.getFD()))); - chunk = actualLoader.load(world, region, decompressedIn, index); + try (InputStream decompressedIn = new BufferedInputStream(compression.decompress(nonClosing(new FileInputStream(raf.getFD()))))) { + chunk = actualLoader.load(world, region, decompressedIn, index); + } lastUsedLoader = actualLoader; } @@ -103,6 +106,13 @@ public Chunk load(RandomAccessFile raf, long offset, int index) throws IOExcepti return null; } + private static InputStream nonClosing(InputStream in) { + return new FilterInputStream(in) { + @Override + public void close() {} + }; + } + private static class ChunkVersionLoader { private final Class dataType;