From 791d4e2c6335e80caebef5cecbb91a9809a933b8 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 1 Aug 2026 15:24:01 -0400 Subject: [PATCH] NetDB: Prevent ClassCastException in HFDSMJ on hash collision --- .../HandleFloodfillDatabaseStoreMessageJob.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java index 021532746..6e65afc30 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java @@ -249,7 +249,15 @@ class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { boolean shouldStore = true; if (ri.getReceivedAsPublished()) { // these are often just dup stores from concurrent lookups - prevNetDb = (RouterInfo) _facade.lookupLocallyWithoutValidation(key); + DatabaseEntry dbe = _facade.lookupLocallyWithoutValidation(key); + if (dbe != null) { + if (dbe.getType() != DatabaseEntry.KEY_TYPE_ROUTERINFO) { + // hash collision + // prevent ClassCastException here + throw new IllegalArgumentException("Attempt to replace LS with " + ri); + } + prevNetDb = (RouterInfo) dbe; + } if (prevNetDb == null) { // actually new int count = _facade.getDataStore().size();