Non-conflicting account duplicate marker value (#8206)
This commit is contained in:
parent
890919d140
commit
517fe73734
|
@ -1098,7 +1098,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memmap"
|
name = "memmap"
|
||||||
version = "0.6.2"
|
version = "0.7.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -1942,7 +1942,6 @@ dependencies = [
|
||||||
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"solana-logger 0.24.0",
|
"solana-logger 0.24.0",
|
||||||
"solana-sdk 0.24.0",
|
"solana-sdk 0.24.0",
|
||||||
"solana_rbpf 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
"solana_rbpf 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -2179,12 +2178,11 @@ dependencies = [
|
||||||
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rayon 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rayon 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"solana-bpf-loader-program 0.24.0",
|
"solana-bpf-loader-program 0.24.0",
|
||||||
"solana-logger 0.24.0",
|
"solana-logger 0.24.0",
|
||||||
"solana-measure 0.24.0",
|
"solana-measure 0.24.0",
|
||||||
|
@ -2213,7 +2211,7 @@ dependencies = [
|
||||||
"hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"num-derive 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num-derive 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -2252,7 +2250,6 @@ dependencies = [
|
||||||
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"num-derive 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num-derive 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"solana-config-program 0.24.0",
|
"solana-config-program 0.24.0",
|
||||||
|
@ -3166,7 +3163,7 @@ dependencies = [
|
||||||
"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
|
"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
|
||||||
"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
|
"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
|
||||||
"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e"
|
"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e"
|
||||||
"checksum memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2ffa2c986de11a9df78620c01eeaaf27d94d3ff02bf81bfcca953102dd0c6ff"
|
"checksum memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
|
||||||
"checksum memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce6075db033bbbb7ee5a0bbd3a3186bbae616f57fb001c485c7ff77955f8177f"
|
"checksum memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce6075db033bbbb7ee5a0bbd3a3186bbae616f57fb001c485c7ff77955f8177f"
|
||||||
"checksum mime 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "dd1d63acd1b78403cc0c325605908475dd9b9a3acbf65ed8bcab97e27014afcf"
|
"checksum mime 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "dd1d63acd1b78403cc0c325605908475dd9b9a3acbf65ed8bcab97e27014afcf"
|
||||||
"checksum mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1a0ed03949aef72dbdf3116a383d7b38b4768e6f960528cd6a6044aa9ed68599"
|
"checksum mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1a0ed03949aef72dbdf3116a383d7b38b4768e6f960528cd6a6044aa9ed68599"
|
||||||
|
|
|
@ -69,7 +69,7 @@ pub fn serialize_parameters(
|
||||||
if is_dup {
|
if is_dup {
|
||||||
v.write_u8(position as u8).unwrap();
|
v.write_u8(position as u8).unwrap();
|
||||||
} else {
|
} else {
|
||||||
v.write_u8(0).unwrap();
|
v.write_u8(std::u8::MAX).unwrap();
|
||||||
v.write_u8(keyed_account.signer_key().is_some() as u8)
|
v.write_u8(keyed_account.signer_key().is_some() as u8)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
v.write_u8(keyed_account.is_writable() as u8).unwrap();
|
v.write_u8(keyed_account.is_writable() as u8).unwrap();
|
||||||
|
@ -375,6 +375,7 @@ mod tests {
|
||||||
// Case: With duplicate accounts
|
// Case: With duplicate accounts
|
||||||
let duplicate_key = Pubkey::new_rand();
|
let duplicate_key = Pubkey::new_rand();
|
||||||
let parameter_account = Account::new_ref(1, 0, &program_id);
|
let parameter_account = Account::new_ref(1, 0, &program_id);
|
||||||
|
let mut keyed_accounts = vec![KeyedAccount::new(&program_key, false, &program_account)];
|
||||||
keyed_accounts.push(KeyedAccount::new(&duplicate_key, false, ¶meter_account));
|
keyed_accounts.push(KeyedAccount::new(&duplicate_key, false, ¶meter_account));
|
||||||
keyed_accounts.push(KeyedAccount::new(&duplicate_key, false, ¶meter_account));
|
keyed_accounts.push(KeyedAccount::new(&duplicate_key, false, ¶meter_account));
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
|
Binary file not shown.
|
@ -46,6 +46,30 @@ static_assert(sizeof(int64_t) == 8);
|
||||||
static_assert(sizeof(uint64_t) == 8);
|
static_assert(sizeof(uint64_t) == 8);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minimum of signed integral types
|
||||||
|
*/
|
||||||
|
# define INT8_MIN (-128)
|
||||||
|
# define INT16_MIN (-32767-1)
|
||||||
|
# define INT32_MIN (-2147483647-1)
|
||||||
|
# define INT64_MIN (-__INT64_C(9223372036854775807)-1)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximum of signed integral types
|
||||||
|
*/
|
||||||
|
# define INT8_MAX (127)
|
||||||
|
# define INT16_MAX (32767)
|
||||||
|
# define INT32_MAX (2147483647)
|
||||||
|
# define INT64_MAX (__INT64_C(9223372036854775807))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximum of unsigned integral types
|
||||||
|
*/
|
||||||
|
# define UINT8_MAX (255)
|
||||||
|
# define UINT16_MAX (65535)
|
||||||
|
# define UINT32_MAX (4294967295U)
|
||||||
|
# define UINT64_MAX (__UINT64_C(18446744073709551615))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NULL
|
* NULL
|
||||||
*/
|
*/
|
||||||
|
@ -265,7 +289,7 @@ SOL_FN_PREFIX bool sol_deserialize(
|
||||||
for (int i = 0; i < params->ka_num; i++) {
|
for (int i = 0; i < params->ka_num; i++) {
|
||||||
uint8_t dup_info = input[0];
|
uint8_t dup_info = input[0];
|
||||||
input += sizeof(uint8_t);
|
input += sizeof(uint8_t);
|
||||||
if (dup_info == 0) {
|
if (dup_info == UINT8_MAX) {
|
||||||
// is signer?
|
// is signer?
|
||||||
params->ka[i].is_signer = *(uint8_t *) input != 0;
|
params->ka[i].is_signer = *(uint8_t *) input != 0;
|
||||||
input += sizeof(uint8_t);
|
input += sizeof(uint8_t);
|
||||||
|
|
|
@ -64,9 +64,9 @@ pub unsafe fn deserialize<'a>(input: *mut u8) -> (&'a Pubkey, Vec<AccountInfo<'a
|
||||||
|
|
||||||
let mut accounts = Vec::with_capacity(num_accounts);
|
let mut accounts = Vec::with_capacity(num_accounts);
|
||||||
for _ in 0..num_accounts {
|
for _ in 0..num_accounts {
|
||||||
let dup_info = *(input.add(offset) as *const u8) as usize;
|
let dup_info = *(input.add(offset) as *const u8);
|
||||||
offset += size_of::<u8>();
|
offset += size_of::<u8>();
|
||||||
if dup_info == 0 {
|
if dup_info == std::u8::MAX {
|
||||||
let is_signer = {
|
let is_signer = {
|
||||||
#[allow(clippy::cast_ptr_alignment)]
|
#[allow(clippy::cast_ptr_alignment)]
|
||||||
let is_signer = *(input.add(offset) as *const u8);
|
let is_signer = *(input.add(offset) as *const u8);
|
||||||
|
@ -110,7 +110,7 @@ pub unsafe fn deserialize<'a>(input: *mut u8) -> (&'a Pubkey, Vec<AccountInfo<'a
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// Duplicate account, clone the original
|
// Duplicate account, clone the original
|
||||||
accounts.push(accounts[dup_info].clone());
|
accounts.push(accounts[dup_info as usize].clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue