diff --git a/evm_loader/lib/src/account_update.rs b/evm_loader/lib/src/account_update.rs index 9927fb020..a51dda7b2 100644 --- a/evm_loader/lib/src/account_update.rs +++ b/evm_loader/lib/src/account_update.rs @@ -13,13 +13,16 @@ fn from_before_revision(account: &mut Account, new_tag: u8) { const PREFIX_BEFORE: usize = ACCOUNT_PREFIX_LEN_BEFORE_REVISION; const PREFIX_AFTER: usize = ACCOUNT_PREFIX_LEN; - assert!(account.data.len() > PREFIX_BEFORE); + let data: &mut Vec = &mut account.data; - let required_len = account.data.len() + PREFIX_AFTER - PREFIX_BEFORE; - account.data.resize(required_len, 0); + assert!(data.len() > PREFIX_BEFORE); + let data_len = data.len() - PREFIX_BEFORE; - account.data.copy_within(PREFIX_BEFORE.., PREFIX_AFTER); - account.data[0] = new_tag; + let required_len = data.len() + PREFIX_AFTER - PREFIX_BEFORE; + data.resize(required_len, 0); + + data.copy_within(PREFIX_BEFORE..(PREFIX_BEFORE + data_len), PREFIX_AFTER); + data[0] = new_tag; } pub fn update_account(program_id: &Pubkey, key: &Pubkey, account: &mut Account) -> NeonResult<()> { diff --git a/evm_loader/program/src/account/legacy/update.rs b/evm_loader/program/src/account/legacy/update.rs index 19670df64..27e9ff817 100644 --- a/evm_loader/program/src/account/legacy/update.rs +++ b/evm_loader/program/src/account/legacy/update.rs @@ -17,18 +17,21 @@ pub fn from_before_revision<'a>( const PREFIX_BEFORE: usize = ACCOUNT_PREFIX_LEN_BEFORE_REVISION; const PREFIX_AFTER: usize = ACCOUNT_PREFIX_LEN; + assert!(account.data_len() > PREFIX_BEFORE); + let data_len = account.data_len() - PREFIX_BEFORE; + let required_len = account.data_len() + PREFIX_AFTER - PREFIX_BEFORE; account.realloc(required_len, false)?; - let minimum_balance = rent.minimum_balance(account.data_len()); + let minimum_balance = rent.minimum_balance(required_len); if account.lamports() < minimum_balance { let required_lamports = minimum_balance - account.lamports(); system.transfer(operator, account, required_lamports)?; } let mut account_data = account.try_borrow_mut_data()?; + account_data.copy_within(PREFIX_BEFORE..(PREFIX_BEFORE + data_len), PREFIX_AFTER); account_data[0] = new_tag; - account_data.copy_within(PREFIX_BEFORE.., PREFIX_AFTER); Ok(()) }