From f21c6253d96066ee1744ce6243790f4cbf85f478 Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Sat, 4 Sep 2021 16:46:36 +0300 Subject: [PATCH 1/2] lang: check that ProgramAccount writable on deref_mut --- CHANGELOG.md | 4 ++++ lang/src/program_account.rs | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7acf4cc85a..c73ac3d5d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ incremented for features. ## [Unreleased] +### Features + +* lang: Check that ProgramAccount writable before mut borrow ([#681](https://github.com/project-serum/anchor/pull/681)). + ## [0.14.0] - 2021-09-02 ### Features diff --git a/lang/src/program_account.rs b/lang/src/program_account.rs index 885157f2f0..d7b47d1160 100644 --- a/lang/src/program_account.rs +++ b/lang/src/program_account.rs @@ -6,6 +6,7 @@ use crate::{ use solana_program::account_info::AccountInfo; use solana_program::entrypoint::ProgramResult; use solana_program::instruction::AccountMeta; +use solana_program::msg; use solana_program::program_error::ProgramError; use solana_program::pubkey::Pubkey; use std::ops::{Deref, DerefMut}; @@ -156,6 +157,11 @@ impl<'a, T: AccountSerialize + AccountDeserialize + Clone> Deref for ProgramAcco impl<'a, T: AccountSerialize + AccountDeserialize + Clone> DerefMut for ProgramAccount<'a, T> { fn deref_mut(&mut self) -> &mut Self::Target { + if !self.inner.info.is_writable { + msg!("The given ProgramAccount is not mutable"); + panic!(); + } + &mut DerefMut::deref_mut(&mut self.inner).account } } From f57962a7c2593ef75c66990c264e15ec4f7d9605 Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Sat, 4 Sep 2021 17:02:40 +0300 Subject: [PATCH 2/2] check only on `anchor-debug` --- CHANGELOG.md | 2 +- lang/src/program_account.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c73ac3d5d5..05e9a18930 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,7 @@ incremented for features. ### Features -* lang: Check that ProgramAccount writable before mut borrow ([#681](https://github.com/project-serum/anchor/pull/681)). +* lang: Check that ProgramAccount writable before mut borrow (`anchor-debug` only) ([#681](https://github.com/project-serum/anchor/pull/681)). ## [0.14.0] - 2021-09-02 diff --git a/lang/src/program_account.rs b/lang/src/program_account.rs index d7b47d1160..dbc856369d 100644 --- a/lang/src/program_account.rs +++ b/lang/src/program_account.rs @@ -6,7 +6,6 @@ use crate::{ use solana_program::account_info::AccountInfo; use solana_program::entrypoint::ProgramResult; use solana_program::instruction::AccountMeta; -use solana_program::msg; use solana_program::program_error::ProgramError; use solana_program::pubkey::Pubkey; use std::ops::{Deref, DerefMut}; @@ -157,8 +156,9 @@ impl<'a, T: AccountSerialize + AccountDeserialize + Clone> Deref for ProgramAcco impl<'a, T: AccountSerialize + AccountDeserialize + Clone> DerefMut for ProgramAccount<'a, T> { fn deref_mut(&mut self) -> &mut Self::Target { + #[cfg(feature = "anchor-debug")] if !self.inner.info.is_writable { - msg!("The given ProgramAccount is not mutable"); + solana_program::msg!("The given ProgramAccount is not mutable"); panic!(); }