From 47511999bbda8daac1c4b1f6a9ad0e8e8eb687f0 Mon Sep 17 00:00:00 2001 From: Sean Young Date: Fri, 13 Oct 2023 08:00:41 +0100 Subject: [PATCH] bank: do not remove trailing 0 bytes from return data (#33639) This is creating havoc for Solang, as the return data is borsh encoded and therefore `u64` values like 0x100 get truncated. --- runtime/src/bank.rs | 12 +++--------- runtime/src/bank/tests.rs | 9 +++++---- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 6f220a810e3f59..8d6c15c10afb62 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -4955,7 +4955,7 @@ impl Bank { let ExecutionRecord { accounts, - mut return_data, + return_data, touched_account_count, accounts_resize_delta, } = transaction_context.into(); @@ -4977,14 +4977,8 @@ impl Bank { saturating_add_assign!(timings.details.changed_account_count, touched_account_count); let accounts_data_len_delta = status.as_ref().map_or(0, |_| accounts_resize_delta); - let return_data = if enable_return_data_recording { - if let Some(end_index) = return_data.data.iter().rposition(|&x| x != 0) { - let end_index = end_index.saturating_add(1); - return_data.data.truncate(end_index); - Some(return_data) - } else { - None - } + let return_data = if enable_return_data_recording && !return_data.data.is_empty() { + Some(return_data) } else { None }; diff --git a/runtime/src/bank/tests.rs b/runtime/src/bank/tests.rs index 69f9d18e5a9b8f..ef1553d9addf31 100644 --- a/runtime/src/bank/tests.rs +++ b/runtime/src/bank/tests.rs @@ -9713,9 +9713,9 @@ fn test_tx_return_data() { let mut return_data = [0u8; MAX_RETURN_DATA]; if !instruction_data.is_empty() { let index = usize::from_le_bytes(instruction_data.try_into().unwrap()); - return_data[index] = 1; + return_data[index / 2] = 1; transaction_context - .set_return_data(mock_program_id, return_data.to_vec()) + .set_return_data(mock_program_id, return_data[..index + 1].to_vec()) .unwrap(); } Ok(()) @@ -9767,8 +9767,9 @@ fn test_tx_return_data() { if let Some(index) = index { let return_data = return_data.unwrap(); assert_eq!(return_data.program_id, mock_program_id); - let mut expected_data = vec![0u8; index]; - expected_data.push(1u8); + let mut expected_data = vec![0u8; index + 1]; + // include some trailing zeros + expected_data[index / 2] = 1; assert_eq!(return_data.data, expected_data); } else { assert!(return_data.is_none());