Retain alloc'd and updated data in cpi (backport #16850) (#16890)

* Retain alloc'd and updated data in cpi (#16850)

(cherry picked from commit 9b3a59f030)

# Conflicts:
#	programs/bpf_loader/src/syscalls.rs
#	sdk/src/feature_set.rs

* resolve conflicts

Co-authored-by: Jack May <jack@solana.com>
This commit is contained in:
mergify[bot]
2021-04-27 23:01:43 +00:00
committed by GitHub
parent 4a3f851e49
commit dbc58455df
6 changed files with 100 additions and 9 deletions

View File

@@ -20,7 +20,7 @@ use solana_sdk::{
epoch_schedule::EpochSchedule,
feature_set::{
cpi_data_cost, cpi_share_ro_and_exec_accounts, demote_sysvar_write_locks,
enforce_aligned_host_addrs, sysvar_via_syscall,
enforce_aligned_host_addrs, sysvar_via_syscall, update_data_on_realloc,
},
hash::{Hasher, HASH_BYTES},
ic_msg,
@@ -1997,7 +1997,7 @@ fn call<'a>(
let invoke_context = syscall.get_context()?;
for (i, (account, account_ref)) in accounts.iter().zip(account_refs).enumerate() {
let account = account.borrow();
if let Some(account_ref) = account_ref {
if let Some(mut account_ref) = account_ref {
if message.is_writable(i, demote_sysvar_write_locks) && !account.executable {
*account_ref.lamports = account.lamports;
*account_ref.owner = account.owner;
@@ -2027,12 +2027,22 @@ fn call<'a>(
)
.into());
}
let _ = translate(
memory_mapping,
AccessType::Store,
account_ref.vm_data_addr,
account.data().len() as u64,
)?;
if invoke_context.is_feature_active(&update_data_on_realloc::id()) {
account_ref.data = translate_slice_mut::<u8>(
memory_mapping,
account_ref.vm_data_addr,
account.data().len() as u64,
&bpf_loader_deprecated::id(), // Don't care since it is byte aligned
true,
)?;
} else {
let _ = translate(
memory_mapping,
AccessType::Store,
account_ref.vm_data_addr,
account.data().len() as u64,
)?;
}
*account_ref.ref_to_len_in_vm = account.data().len() as u64;
*account_ref.serialized_len_ptr = account.data().len() as u64;
}