From 3aefd75999534c12db446ad11b18b90e28cd0a44 Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Thu, 6 Aug 2020 12:34:36 -0600 Subject: [PATCH] Prevent transaction status match outside of primary-index bounds --- ledger/src/blockstore.rs | 9 +++++---- ledger/src/blockstore_db.rs | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/ledger/src/blockstore.rs b/ledger/src/blockstore.rs index a66133a86b8f5e..986964655a3be7 100644 --- a/ledger/src/blockstore.rs +++ b/ledger/src/blockstore.rs @@ -1804,9 +1804,9 @@ impl Blockstore { (transaction_status_cf_primary_index, signature, 0), IteratorDirection::Forward, ))?; - for ((_, sig, slot), data) in index_iterator { + for ((i, sig, slot), data) in index_iterator { counter += 1; - if sig != signature { + if i != transaction_status_cf_primary_index || sig != signature { break; } if self.is_root(slot) { @@ -1842,8 +1842,9 @@ impl Blockstore { ("method", "get_confirmed_transaction".to_string(), String) ); if let Some((slot, status)) = self.get_transaction_status(signature)? { - let transaction = self.find_transaction_in_slot(slot, signature)? - .expect("Transaction to exist in slot entries if it exists in statuses and hasn't been cleaned up"); + let transaction = self + .find_transaction_in_slot(slot, signature)? + .ok_or(BlockstoreError::TransactionStatusSlotMismatch)?; // Should not happen let encoding = encoding.unwrap_or(UiTransactionEncoding::Json); let encoded_transaction = EncodedTransaction::encode(transaction, encoding); Ok(Some(ConfirmedTransaction { diff --git a/ledger/src/blockstore_db.rs b/ledger/src/blockstore_db.rs index edfcd985a44376..93409f23d94171 100644 --- a/ledger/src/blockstore_db.rs +++ b/ledger/src/blockstore_db.rs @@ -58,6 +58,7 @@ pub enum BlockstoreError { SlotCleanedUp, UnpackError(#[from] UnpackError), UnableToSetOpenFileDescriptorLimit, + TransactionStatusSlotMismatch, } pub type Result = std::result::Result;