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:
parent
923d5b5324
commit
47511999bb
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
|
@ -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());
|
||||||
|
|
Loading…
Reference in New Issue