From 9f760edd2575b45a6efbf0da7b1f66a5b1d2fb09 Mon Sep 17 00:00:00 2001 From: Alva Swanson Date: Tue, 9 Jan 2024 15:04:14 +0100 Subject: [PATCH] TxValidator: Fix fee check crash on invalid JSON response The initialSanityChecks method only checks whether the JSON response is null (HTTP request failed) or the response is empty (HTTP 200) before parsing the JSON response. A invalid JSON response would throw a JsonSyntaxException exception which the callers are not catching. --- .../bisq/core/provider/mempool/TxValidator.java | 14 ++++++++++---- .../bisq/core/fee/TxValidatorSanityCheckTests.java | 9 +++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/bisq/core/provider/mempool/TxValidator.java b/core/src/main/java/bisq/core/provider/mempool/TxValidator.java index b5f34f35b23..479724f7db2 100644 --- a/core/src/main/java/bisq/core/provider/mempool/TxValidator.java +++ b/core/src/main/java/bisq/core/provider/mempool/TxValidator.java @@ -94,8 +94,9 @@ public TxValidator(DaoStateService daoStateService, String txId, FilterManager f public TxValidator parseJsonValidateMakerFeeTx(String jsonTxt, List btcFeeReceivers) { this.jsonTxt = jsonTxt; - FeeValidationStatus status = initialSanityChecks(txId, jsonTxt); + FeeValidationStatus status; try { + status = initialSanityChecks(txId, jsonTxt); if (status.pass()) { status = checkFeeAddressBTC(jsonTxt, btcFeeReceivers); if (status.pass()) { @@ -131,8 +132,9 @@ public TxValidator validateBsqFeeTx(boolean isMaker) { public TxValidator parseJsonValidateTakerFeeTx(String jsonTxt, List btcFeeReceivers) { this.jsonTxt = jsonTxt; - FeeValidationStatus status = initialSanityChecks(txId, jsonTxt); + FeeValidationStatus status; try { + status = initialSanityChecks(txId, jsonTxt); if (status.pass()) { status = checkFeeAddressBTC(jsonTxt, btcFeeReceivers); if (status.pass()) { @@ -148,10 +150,14 @@ public TxValidator parseJsonValidateTakerFeeTx(String jsonTxt, List btcF } public long parseJsonValidateTx() { - if (!initialSanityChecks(txId, jsonTxt).pass()) { + try { + if (!initialSanityChecks(txId, jsonTxt).pass()) { + return -1; + } + return getTxConfirms(jsonTxt, chainHeight); + } catch (JsonSyntaxException e) { return -1; } - return getTxConfirms(jsonTxt, chainHeight); } /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/core/src/test/java/bisq/core/fee/TxValidatorSanityCheckTests.java b/core/src/test/java/bisq/core/fee/TxValidatorSanityCheckTests.java index 4103061f211..a6ebd611de4 100644 --- a/core/src/test/java/bisq/core/fee/TxValidatorSanityCheckTests.java +++ b/core/src/test/java/bisq/core/fee/TxValidatorSanityCheckTests.java @@ -70,6 +70,15 @@ void nullAndEmptyMempoolResponse(String jsonText) { assertThat(status, is(equalTo(FeeValidationStatus.NACK_JSON_ERROR))); } + @Test + void invalidJsonResponse() { + String invalidJson = "in\"valid'json',"; + TxValidator txValidator1 = txValidator.parseJsonValidateMakerFeeTx(invalidJson, FEE_RECEIVER_ADDRESSES); + + FeeValidationStatus status = txValidator1.getStatus(); + assertThat(status, is(equalTo(FeeValidationStatus.NACK_JSON_ERROR))); + } + @ParameterizedTest @ValueSource(strings = {"status", "txid"}) void mempoolResponseWithMissingField(String missingField) throws IOException {