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.
This commit is contained in:
Sean Young 2023-10-13 08:00:41 +01:00 committed by GitHub
parent 923d5b5324
commit 47511999bb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 13 deletions

View File

@ -4955,7 +4955,7 @@ impl Bank {
let ExecutionRecord { let ExecutionRecord {
accounts, accounts,
mut return_data, return_data,
touched_account_count, touched_account_count,
accounts_resize_delta, accounts_resize_delta,
} = transaction_context.into(); } = transaction_context.into();
@ -4977,14 +4977,8 @@ impl Bank {
saturating_add_assign!(timings.details.changed_account_count, touched_account_count); 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 accounts_data_len_delta = status.as_ref().map_or(0, |_| accounts_resize_delta);
let return_data = if enable_return_data_recording { let return_data = if enable_return_data_recording && !return_data.data.is_empty() {
if let Some(end_index) = return_data.data.iter().rposition(|&x| x != 0) { Some(return_data)
let end_index = end_index.saturating_add(1);
return_data.data.truncate(end_index);
Some(return_data)
} else {
None
}
} else { } else {
None None
}; };

View File

@ -9713,9 +9713,9 @@ fn test_tx_return_data() {
let mut return_data = [0u8; MAX_RETURN_DATA]; let mut return_data = [0u8; MAX_RETURN_DATA];
if !instruction_data.is_empty() { if !instruction_data.is_empty() {
let index = usize::from_le_bytes(instruction_data.try_into().unwrap()); let index = usize::from_le_bytes(instruction_data.try_into().unwrap());
return_data[index] = 1; return_data[index / 2] = 1;
transaction_context 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(); .unwrap();
} }
Ok(()) Ok(())
@ -9767,8 +9767,9 @@ fn test_tx_return_data() {
if let Some(index) = index { if let Some(index) = index {
let return_data = return_data.unwrap(); let return_data = return_data.unwrap();
assert_eq!(return_data.program_id, mock_program_id); assert_eq!(return_data.program_id, mock_program_id);
let mut expected_data = vec![0u8; index]; let mut expected_data = vec![0u8; index + 1];
expected_data.push(1u8); // include some trailing zeros
expected_data[index / 2] = 1;
assert_eq!(return_data.data, expected_data); assert_eq!(return_data.data, expected_data);
} else { } else {
assert!(return_data.is_none()); assert!(return_data.is_none());