From afa14d69687d5d0ce03207c658d2d237ae166a6d Mon Sep 17 00:00:00 2001 From: Oscar Guindzberg Date: Mon, 19 Mar 2018 15:49:51 -0300 Subject: [PATCH] Transaction: Limit initial size of inputs and outputs ArrayList. --- core/src/main/java/org/bitcoinj/core/Transaction.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/bitcoinj/core/Transaction.java b/core/src/main/java/org/bitcoinj/core/Transaction.java index 5a15e854..61dda5c5 100644 --- a/core/src/main/java/org/bitcoinj/core/Transaction.java +++ b/core/src/main/java/org/bitcoinj/core/Transaction.java @@ -122,6 +122,11 @@ public class Transaction extends ChildMessage { */ public static final Coin MIN_NONDUST_OUTPUT = Coin.valueOf(546); // satoshis + /** + * Max initial size of inputs and outputs ArrayList. + */ + public static final int MAX_INITIAL_INPUTS_OUTPUTS_SIZE = 20; + // These are bitcoin serialized. private long version; private ArrayList inputs; @@ -568,7 +573,7 @@ public class Transaction extends ChildMessage { // First come the inputs. long numInputs = readVarInt(); optimalEncodingMessageSize += VarInt.sizeOf(numInputs); - inputs = new ArrayList<>((int) numInputs); + inputs = new ArrayList<>(Math.min((int) numInputs, MAX_INITIAL_INPUTS_OUTPUTS_SIZE)); for (long i = 0; i < numInputs; i++) { TransactionInput input = new TransactionInput(params, this, payload, cursor, serializer); inputs.add(input); @@ -579,7 +584,7 @@ public class Transaction extends ChildMessage { // Now the outputs long numOutputs = readVarInt(); optimalEncodingMessageSize += VarInt.sizeOf(numOutputs); - outputs = new ArrayList<>((int) numOutputs); + outputs = new ArrayList<>(Math.min((int) numOutputs, MAX_INITIAL_INPUTS_OUTPUTS_SIZE)); for (long i = 0; i < numOutputs; i++) { TransactionOutput output = new TransactionOutput(params, this, payload, cursor, serializer); outputs.add(output);