From c71cc3d43a3313bdaf526b6ca536b39d46bb8d72 Mon Sep 17 00:00:00 2001 From: vlofgren Date: Sat, 16 Jul 2022 18:58:19 +0200 Subject: [PATCH] Fix overflow bugs in DictionaryHashMap that only surfaced without small RAM --- .../java/nu/marginalia/util/dict/DictionaryData.java | 9 +++++++-- .../java/nu/marginalia/util/dict/DictionaryHashMap.java | 3 +-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/marginalia_nu/src/main/java/nu/marginalia/util/dict/DictionaryData.java b/marginalia_nu/src/main/java/nu/marginalia/util/dict/DictionaryData.java index c36c10d2..9aa953dc 100644 --- a/marginalia_nu/src/main/java/nu/marginalia/util/dict/DictionaryData.java +++ b/marginalia_nu/src/main/java/nu/marginalia/util/dict/DictionaryData.java @@ -59,12 +59,14 @@ public class DictionaryData { private final LongBuffer keys; private int size; + private final int capacity; public DictionaryDataBank(int start_idx, int sz) { this.start_idx = start_idx; + this.capacity = sz; - keys = ByteBuffer.allocateDirect(8*sz).asLongBuffer(); + keys = ByteBuffer.allocateDirect(8*capacity).asLongBuffer(); size = 0; } @@ -88,10 +90,13 @@ public class DictionaryData { throw new IndexOutOfBoundsException(idx); } - return keys.get(idx - start_idx) == other; + return keys.get(idx - start_idx) == other; } public int add(long newKey) { + if (size >= capacity) + return -1; + keys.put(size, newKey); return start_idx + size++; diff --git a/marginalia_nu/src/main/java/nu/marginalia/util/dict/DictionaryHashMap.java b/marginalia_nu/src/main/java/nu/marginalia/util/dict/DictionaryHashMap.java index 5544545a..1c76b116 100644 --- a/marginalia_nu/src/main/java/nu/marginalia/util/dict/DictionaryHashMap.java +++ b/marginalia_nu/src/main/java/nu/marginalia/util/dict/DictionaryHashMap.java @@ -66,8 +66,7 @@ public class DictionaryHashMap { logger.debug("Buffer size sanity checked passed"); } - - dictionaryData = new DictionaryData(Math.min(1<<30, Math.max(32, (int)(sizeMemory/4)))); + dictionaryData = new DictionaryData((int)Math.min(1<<27, Math.max(32L, sizeMemory/4))); initializeBuffers(); }