Align C and Rust handling of AccountInfos (#8906)

This commit is contained in:
Jack May
2020-03-17 12:34:14 -07:00
committed by GitHub
parent 61514e3b0e
commit 668dfc40c7
2 changed files with 18 additions and 3 deletions

View File

@ -9,7 +9,7 @@
*/ */
extern uint64_t entrypoint(const uint8_t *input) { extern uint64_t entrypoint(const uint8_t *input) {
SolKeyedAccount ka[4]; SolKeyedAccount ka[1];
SolParameters params = (SolParameters) { .ka = ka }; SolParameters params = (SolParameters) { .ka = ka };
if (!sol_deserialize(input, &params, SOL_ARRAY_SIZE(ka))) { if (!sol_deserialize(input, &params, SOL_ARRAY_SIZE(ka))) {

View File

@ -284,13 +284,29 @@ SOL_FN_PREFIX bool sol_deserialize(
} }
params->ka_num = *(uint64_t *) input; params->ka_num = *(uint64_t *) input;
input += sizeof(uint64_t); input += sizeof(uint64_t);
if (ka_num < params->ka_num) {
if (ka_num > params->ka_num) {
return false; return false;
} }
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 (i >= ka_num) {
if (dup_info == UINT8_MAX) {
input += sizeof(uint8_t);
input += sizeof(uint8_t);
input += sizeof(SolPubkey);
input += sizeof(uint64_t);
input += *(uint64_t *) input;
input += sizeof(uint64_t);
input += sizeof(SolPubkey);
input += sizeof(uint8_t);
input += sizeof(uint64_t);
}
continue;
}
if (dup_info == UINT8_MAX) { 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;
@ -418,7 +434,6 @@ SOL_FN_PREFIX void sol_log_params(const SolParameters *params) {
*/ */
uint64_t entrypoint(const uint8_t *input); uint64_t entrypoint(const uint8_t *input);
#ifdef SOL_TEST #ifdef SOL_TEST
/** /**
* Stub log functions when building tests * Stub log functions when building tests