From a64d0a54b16ed9d379a9a8e8cc22e8a2b5a4a8c4 Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 31 Dec 2010 13:16:46 +0000 Subject: [PATCH] * Datagram Dissector: Fix RuntimeException caused by reuse, preventing iMule from connecting on UDP (thanks devzero) --- .../i2p/client/datagram/I2PDatagramDissector.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/core/java/src/net/i2p/client/datagram/I2PDatagramDissector.java b/core/java/src/net/i2p/client/datagram/I2PDatagramDissector.java index cb16f2ab4..4748e7495 100644 --- a/core/java/src/net/i2p/client/datagram/I2PDatagramDissector.java +++ b/core/java/src/net/i2p/client/datagram/I2PDatagramDissector.java @@ -37,9 +37,9 @@ public final class I2PDatagramDissector { private Hash rxHash = null; - private Signature rxSign = new Signature(); + private Signature rxSign; - private Destination rxDest = new Destination(); + private Destination rxDest; private byte[] rxPayload = new byte[DGRAM_BUFSIZE]; @@ -68,6 +68,9 @@ public final class I2PDatagramDissector { this.valid = false; try { + rxDest = new Destination(); + rxSign = new Signature(); + // read destination rxDest.readBytes(dgStream); @@ -153,6 +156,8 @@ public final class I2PDatagramDissector { * @return The Destination of the I2P repliable datagram sender */ public Destination extractSender() { + if (this.rxDest == null) + return null; Destination retDest = new Destination(); try { retDest.fromByteArray(this.rxDest.toByteArray()); @@ -184,6 +189,10 @@ public final class I2PDatagramDissector { if(this.valid) return; + if (rxSign == null || rxSign.getData() == null || + rxDest == null || rxDest.getSigningPublicKey() == null) + throw new I2PInvalidDatagramException("Datagram not yet read"); + // now validate if (!this.dsaEng.verifySignature(rxSign, rxHash.getData(), rxDest.getSigningPublicKey())) throw new I2PInvalidDatagramException("Incorrect I2P repliable datagram signature");