From 9b5a7981aa44dfebba4f3f23d4bd0342472eb7d8 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 17 Oct 2015 16:28:52 -0400 Subject: [PATCH] So there are archives not in the index, not sure what to do with it --- src/main/java/net/runelite/cache/fs/Index.java | 10 ++++++++++ src/main/java/net/runelite/cache/fs/IndexFile.java | 11 ++++++++++- src/main/java/net/runelite/cache/fs/Store.java | 2 +- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/runelite/cache/fs/Index.java b/src/main/java/net/runelite/cache/fs/Index.java index cb116f833b..660794d4c5 100644 --- a/src/main/java/net/runelite/cache/fs/Index.java +++ b/src/main/java/net/runelite/cache/fs/Index.java @@ -9,9 +9,13 @@ import java.util.List; import java.util.Objects; import net.runelite.cache.fs.io.InputStream; import net.runelite.cache.fs.io.OutputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class Index implements Closeable { + private static final Logger logger = LoggerFactory.getLogger(Index.class); + private final Store store; private final IndexFile index; private final int id; @@ -227,6 +231,12 @@ public class Index implements Closeable for (Archive a : archives) { IndexEntry entry = this.index.read(a.getArchiveId()); + if (entry == null) + { + logger.warn("can't read archive " + a.getArchiveId() + " from index " + this.id); + continue; + } + assert this.index.getIndexFileId() == this.id; assert entry.getId() == a.getArchiveId(); DataFileReadResult res = store.getData().read(this.id, entry.getId(), entry.getSector(), entry.getLength()); // needs decompress etc... diff --git a/src/main/java/net/runelite/cache/fs/IndexFile.java b/src/main/java/net/runelite/cache/fs/IndexFile.java index ddb5febd39..59c99ad1c6 100644 --- a/src/main/java/net/runelite/cache/fs/IndexFile.java +++ b/src/main/java/net/runelite/cache/fs/IndexFile.java @@ -91,11 +91,20 @@ public class IndexFile implements Closeable idx.seek(id * INDEX_ENTRY_LEN); int i = idx.read(buffer); if (i != INDEX_ENTRY_LEN) - logger.warn("short read"); + { + logger.warn("short read for id {}: {}", id, i); + return null; + } int length = ((buffer[0] & 0xFF) << 16) | ((buffer[1] & 0xFF) << 8) | (buffer[2] & 0xFF); int sector = ((buffer[3] & 0xFF) << 16) | ((buffer[4] & 0xFF) << 8) | (buffer[5] & 0xFF); + if (length <= 0 || sector <= 0) + { + logger.warn("invalid length or sector {}/{}", length, sector); + return null; + } + return new IndexEntry(this, id, sector, length); } diff --git a/src/main/java/net/runelite/cache/fs/Store.java b/src/main/java/net/runelite/cache/fs/Store.java index 0600c8efff..c9c1aab7b4 100644 --- a/src/main/java/net/runelite/cache/fs/Store.java +++ b/src/main/java/net/runelite/cache/fs/Store.java @@ -102,7 +102,7 @@ public class Store implements Closeable { int id = i.getIndex().getIndexFileId(); if (id == 5) - break; + continue; i.load(); } }