From 43c2018177ba5d309a1983a7a6128917a814c7e6 Mon Sep 17 00:00:00 2001 From: zzz Date: Thu, 5 Jul 2018 12:57:01 +0000 Subject: [PATCH] i2psnark: Fix IOOBE when stopping torrent that is allocating (ticket #2273) more sync in PartialPiece --- .../src/org/klomp/snark/PartialPiece.java | 6 +++--- .../java/src/org/klomp/snark/PeerState.java | 2 +- .../java/src/org/klomp/snark/Request.java | 19 +++++++++++++++++++ .../src/net/i2p/router/RouterVersion.java | 2 +- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/PartialPiece.java b/apps/i2psnark/java/src/org/klomp/snark/PartialPiece.java index 6cf35836d..7bdeecb40 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PartialPiece.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PartialPiece.java @@ -112,7 +112,7 @@ class PartialPiece implements Comparable { * as set by setDownloaded() or read(). */ - public Request getRequest() { + public synchronized Request getRequest() { return new Request(this, this.off, Math.min(this.pclen - this.off, PeerState.PARTSIZE)); } @@ -131,7 +131,7 @@ class PartialPiece implements Comparable { /** * How many bytes are good - as set by setDownloaded() or read() */ - public int getDownloaded() { + public synchronized int getDownloaded() { return this.off; } @@ -141,7 +141,7 @@ class PartialPiece implements Comparable { * Any chunks after a 'hole' will be lost. * @since 0.9.1 */ - public void setDownloaded(int offset) { + public synchronized void setDownloaded(int offset) { this.off = offset; } diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java index 53f30a4ad..2e3edf164 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java @@ -546,7 +546,7 @@ class PeerState implements DataLoader synchronized(pp) { int dl = pp.getDownloaded(); if (req.off != dl) - req = new Request(pp, dl, 1); + req = new Request(pp, dl); } rv.add(req); } diff --git a/apps/i2psnark/java/src/org/klomp/snark/Request.java b/apps/i2psnark/java/src/org/klomp/snark/Request.java index fddbb2b53..1e8cbaebc 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Request.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Request.java @@ -52,6 +52,25 @@ class Request throw new IndexOutOfBoundsException("Illegal Request " + toString()); } + /** + * Dummy Request for PeerState.returnPartialPieces(). + * len will be zero. + * + * @param piece Piece number requested. + * @param off the offset in the array. + * @since 0.9.36 + */ + Request(PartialPiece piece, int off) + { + this.piece = piece; + this.off = off; + this.len = 0; + + // Sanity check + if (off < 0 || off > piece.getLength()) + throw new IndexOutOfBoundsException("Illegal Request " + toString()); + } + /** * @since 0.9.1 */ diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index f6e6df3a5..4e28a2c8d 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 4; + public final static long BUILD = 5; /** for example "-test" */ public final static String EXTRA = "";