From c8afc5b4d20f244116c355ccf53d2c65d3466014 Mon Sep 17 00:00:00 2001 From: rihi <19492038+rihi@users.noreply.github.com> Date: Sun, 31 Mar 2024 21:15:08 +0200 Subject: [PATCH] Fix LumpFile error with invalid offet/size Fixes checks of valid offset/size and also try to gracefully handle these cases by defaulting to sensible values. Motivated by https://github.com/ata4/bspsrc/issues/150#issuecomment-2028457654 --- .../main/java/info/ata4/bspsrc/lib/BspFile.java | 4 ++-- .../info/ata4/bspsrc/lib/lump/LumpFile.java | 17 +++++++++-------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/bspsrc-lib/src/main/java/info/ata4/bspsrc/lib/BspFile.java b/bspsrc-lib/src/main/java/info/ata4/bspsrc/lib/BspFile.java index d744269c..265755da 100644 --- a/bspsrc-lib/src/main/java/info/ata4/bspsrc/lib/BspFile.java +++ b/bspsrc-lib/src/main/java/info/ata4/bspsrc/lib/BspFile.java @@ -358,7 +358,7 @@ private void loadLumps(ByteBuffer bb) { } Lump l = new Lump(i, ltype); - l.setBuffer(ByteBufferUtils.getSlice(bb, ofs, len)); + l.setBuffer(bb.slice(ofs, len).order(bb.order())); l.setOffset(ofs); l.setParentFile(file); l.setFourCC(fourCC); @@ -600,7 +600,7 @@ && checkInvalidHeaders(in, false) } GameLump gl = new GameLump(); - gl.setBuffer(ByteBufferUtils.getSlice(lump.getBuffer(), ofs, len)); + gl.setBuffer(lump.getBuffer().slice(ofs, len).order(lump.getBuffer().order())); gl.setOffset(ofs); gl.setFourCC(fourCC); gl.setFlags(flags); diff --git a/bspsrc-lib/src/main/java/info/ata4/bspsrc/lib/lump/LumpFile.java b/bspsrc-lib/src/main/java/info/ata4/bspsrc/lib/lump/LumpFile.java index afe9625f..53ea0d58 100644 --- a/bspsrc-lib/src/main/java/info/ata4/bspsrc/lib/lump/LumpFile.java +++ b/bspsrc-lib/src/main/java/info/ata4/bspsrc/lib/lump/LumpFile.java @@ -78,21 +78,22 @@ public void load(Path file, ByteOrder bo) throws IOException { L.trace("Lump size: {}", lumpSize); L.trace("Map revision: {}", mapRev); - if (lumpOffset != HEADER_SIZE) { - throw new LumpException("Unexpected lump offset: " + lumpOffset); - } - if (lumpIndex < 0 || lumpIndex > BspFile.HEADER_LUMPS) { throw new LumpException("Invalid lump ID: " + lumpIndex); } - - if (lumpSize < 0 || lumpOffset > bb.limit()) { - throw new LumpException("Invalid lump size: " + lumpOffset); + if (lumpOffset < 0 || lumpOffset > bb.limit()) { + L.warn("Invalid offset %d for lump %d, assuming %d".formatted(lumpOffset, lumpIndex, HEADER_SIZE)); + lumpOffset = HEADER_SIZE; + } + if (lumpSize < 0 || lumpOffset + lumpSize > bb.limit()) { + int newLumpSize = bb.limit() - lumpOffset; + L.warn("Invalid size %d for lump %d, assuming %d".formatted(lumpSize, lumpIndex, newLumpSize)); + lumpSize = newLumpSize; } // lump data lump = new Lump(lumpIndex, LumpType.get(lumpIndex, bspVersion)); - lump.setBuffer(ByteBufferUtils.getSlice(bb, lumpOffset, lumpSize)); + lump.setBuffer(bb.slice(lumpOffset, lumpSize).order(bb.order())); lump.setOffset(lumpOffset); lump.setParentFile(file); }