diff --git a/router/java/src/net/i2p/router/transport/udp/PeerState2.java b/router/java/src/net/i2p/router/transport/udp/PeerState2.java index 526cfe06979c42f11940ee45345ecdc7e471758d..a37c945e8c986f9b5606876c10607b5e12ae343e 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerState2.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerState2.java @@ -567,12 +567,19 @@ public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback _log.debug("Got dup ACK block: " + SSU2Bitfield.toString(ackThru, acks, ranges, (ranges != null ? ranges.length / 2 : 0))); return; } - SSU2Bitfield ackbf; - ackbf = SSU2Bitfield.fromACKBlock(ackThru, acks, ranges, (ranges != null ? ranges.length / 2 : 0)); - if (_log.shouldDebug()) - _log.debug("Got new ACK block: " + SSU2Bitfield.toString(ackThru, acks, ranges, (ranges != null ? ranges.length / 2 : 0))); - // calls bitSet() below - ackbf.forEachAndNot(_ackedMessages, this); + try { + SSU2Bitfield ackbf = SSU2Bitfield.fromACKBlock(ackThru, acks, ranges, (ranges != null ? ranges.length / 2 : 0)); + if (_log.shouldDebug()) + _log.debug("Got new ACK block: " + SSU2Bitfield.toString(ackThru, acks, ranges, (ranges != null ? ranges.length / 2 : 0))); + // calls bitSet() below + ackbf.forEachAndNot(_ackedMessages, this); + } catch (Exception e) { + // IllegalArgumentException, buggy ack block, let the other blocks get processed + if (_log.shouldWarn()) + _log.warn("Bad ACK block\n" + SSU2Bitfield.toString(ackThru, acks, ranges, (ranges != null ? ranges.length / 2 : 0)) + + "\nAck through " + ackThru + " acks " + acks + (ranges != null ? "\n" + HexDump.dump(ranges) : "") + + "\nfrom " + this, e); + } } public void gotTermination(int reason, long count) { diff --git a/router/java/src/net/i2p/router/transport/udp/SSU2Bitfield.java b/router/java/src/net/i2p/router/transport/udp/SSU2Bitfield.java index bbad4ed2772ab4615bb7a720ce3a5f6da86163c0..df14fe2b4475258136c7e8e65198f2769a53bdb7 100644 --- a/router/java/src/net/i2p/router/transport/udp/SSU2Bitfield.java +++ b/router/java/src/net/i2p/router/transport/udp/SSU2Bitfield.java @@ -36,7 +36,7 @@ class SSU2Bitfield { */ public SSU2Bitfield(int size, long offset) { if (size <= 0 || offset < 0) - throw new IllegalArgumentException(); + throw new IllegalArgumentException("size " + size + " offset " + offset); // force mult. of 256 size = (size + 255) & 0x7FFFFF00; this.size = size;