Skip to content

Commit 349d479

Browse files
flamenco, bpf: fix deserialization error handling (#6895)
1 parent 77ea96d commit 349d479

File tree

2 files changed

+48
-39
lines changed

2 files changed

+48
-39
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5db76a8e7fdf2655eaca4fc6e1941ed4faf7287f
1+
09c52cc1c7aa19dc095a978f1d058e05e45dbb16

src/flamenco/runtime/program/fd_bpf_loader_serialization.c

Lines changed: 47 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -513,35 +513,46 @@ fd_bpf_loader_input_deserialize_aligned( fd_exec_instr_ctx_t * ctx,
513513
return FD_EXECUTOR_INSTR_ERR_INVALID_REALLOC;
514514
}
515515

516+
int can_data_be_changed_err = 0;
516517
if( !stricter_abi_and_runtime_constraints ) {
517518
/* https://github.com/anza-xyz/agave/blob/v3.0.4/program-runtime/src/serialization.rs#L617-L627 */
518-
int err = 0;
519-
if( fd_borrowed_account_can_data_be_resized( &view_acc, post_len, &err ) &&
520-
fd_borrowed_account_can_data_be_changed( &view_acc, &err ) ) {
521519

522-
int err = fd_borrowed_account_set_data_from_slice( &view_acc, post_data, post_len );
523-
if( FD_UNLIKELY( err ) ) {
524-
return err;
520+
/* https://github.com/anza-xyz/agave/blob/v3.0.4/program-runtime/src/serialization.rs#L618-L620 */
521+
if( FD_UNLIKELY( start + post_len > buffer_sz ) ) {
522+
return FD_EXECUTOR_INSTR_ERR_INVALID_ARG;
523+
}
524+
525+
/* https://github.com/anza-xyz/agave/blob/v3.0.4/program-runtime/src/serialization.rs#L621-L626 */
526+
int can_data_be_resized_err = 0;
527+
if( fd_borrowed_account_can_data_be_resized( &view_acc, post_len, &can_data_be_resized_err ) &&
528+
fd_borrowed_account_can_data_be_changed( &view_acc, &can_data_be_changed_err ) ) {
529+
int set_data_err = fd_borrowed_account_set_data_from_slice( &view_acc, post_data, post_len );
530+
if( FD_UNLIKELY( set_data_err ) ) {
531+
return set_data_err;
532+
}
533+
} else {
534+
if( FD_UNLIKELY( fd_borrowed_account_get_data_len( &view_acc )!=post_len ||
535+
memcmp( fd_borrowed_account_get_data( &view_acc ), post_data, post_len ) ) ) {
536+
return can_data_be_resized_err ? can_data_be_resized_err : can_data_be_changed_err;
525537
}
538+
}
526539

527-
} else if( FD_UNLIKELY( fd_borrowed_account_get_data_len( &view_acc )!=post_len ||
528-
memcmp( fd_borrowed_account_get_data( &view_acc ), post_data, post_len ) ) ) {
529-
return err;
540+
} else if( !direct_mapping && fd_borrowed_account_can_data_be_changed( &view_acc, &can_data_be_changed_err ) ) {
541+
/* https://github.com/anza-xyz/agave/blob/v3.0.4/program-runtime/src/serialization.rs#L629-L631 */
542+
if( FD_UNLIKELY( start + post_len > buffer_sz ) ) {
543+
return FD_EXECUTOR_INSTR_ERR_INVALID_ARG;
530544
}
531-
} else if( !direct_mapping ) {
532-
int err = 0;
533-
if( fd_borrowed_account_can_data_be_changed( &view_acc, &err ) ) {
534-
/* https://github.com/anza-xyz/agave/blob/v3.0.4/program-runtime/src/serialization.rs#L627-L633 */
535-
int err = fd_borrowed_account_set_data_from_slice( &view_acc, post_data, post_len );
536-
if( FD_UNLIKELY( err ) ) {
537-
return err;
538-
}
545+
546+
/* https://github.com/anza-xyz/agave/blob/v3.0.4/program-runtime/src/serialization.rs#L627-L633 */
547+
int set_data_err = fd_borrowed_account_set_data_from_slice( &view_acc, post_data, post_len );
548+
if( FD_UNLIKELY( set_data_err ) ) {
549+
return set_data_err;
539550
}
540551
} else if( fd_borrowed_account_get_data_len( &view_acc ) != post_len ) {
541552
/* https://github.com/anza-xyz/agave/blob/v3.0.4/program-runtime/src/serialization.rs#L633-L635 */
542-
int err = fd_borrowed_account_set_data_length( &view_acc, post_len );
543-
if( FD_UNLIKELY( err ) ) {
544-
return err;
553+
int set_data_length_err = fd_borrowed_account_set_data_length( &view_acc, post_len );
554+
if( FD_UNLIKELY( set_data_length_err ) ) {
555+
return set_data_length_err;
545556
}
546557
}
547558

@@ -754,32 +765,30 @@ fd_bpf_loader_input_deserialize_unaligned( fd_exec_instr_ctx_t * ctx,
754765
uchar * post_data = input_cursor;
755766

756767
/* https://github.com/anza-xyz/agave/blob/v3.0.4/program-runtime/src/serialization.rs#L436-L446 */
768+
int can_data_be_changed_err = 0;
757769
if( !stricter_abi_and_runtime_constraints ) {
758-
int err = 0;
759-
if( fd_borrowed_account_can_data_be_resized( &view_acc, pre_len, &err ) &&
760-
fd_borrowed_account_can_data_be_changed( &view_acc, &err ) ) {
761-
err = fd_borrowed_account_set_data_from_slice( &view_acc, post_data, pre_len );
762-
if( FD_UNLIKELY( err ) ) {
763-
return err;
770+
int can_data_be_resized_err = 0;
771+
if( fd_borrowed_account_can_data_be_resized( &view_acc, pre_len, &can_data_be_resized_err ) &&
772+
fd_borrowed_account_can_data_be_changed( &view_acc, &can_data_be_changed_err ) ) {
773+
int set_data_err = fd_borrowed_account_set_data_from_slice( &view_acc, post_data, pre_len );
774+
if( FD_UNLIKELY( set_data_err ) ) {
775+
return set_data_err;
764776
}
765777
} else if( fd_borrowed_account_get_data_len( &view_acc ) != pre_len ||
766778
memcmp( post_data, fd_borrowed_account_get_data( &view_acc ), pre_len ) ) {
767-
return err;
768-
}
769-
} else if( !direct_mapping ) {
770-
int err = 0;
771-
if( fd_borrowed_account_can_data_be_changed( &view_acc, &err ) ) {
772-
/* https://github.com/anza-xyz/agave/blob/v3.0.4/program-runtime/src/serialization.rs#L446-L452 */
773-
err = fd_borrowed_account_set_data_from_slice( &view_acc, post_data, post_len );
774-
if( FD_UNLIKELY( err ) ) {
775-
return err;
779+
return can_data_be_resized_err ? can_data_be_resized_err : can_data_be_changed_err;
776780
}
781+
} else if( !direct_mapping && fd_borrowed_account_can_data_be_changed( &view_acc, &can_data_be_changed_err ) ) {
782+
/* https://github.com/anza-xyz/agave/blob/v3.0.4/program-runtime/src/serialization.rs#L446-L452 */
783+
int set_data_err = fd_borrowed_account_set_data_from_slice( &view_acc, post_data, post_len );
784+
if( FD_UNLIKELY( set_data_err ) ) {
785+
return set_data_err;
777786
}
778787
} else if( fd_borrowed_account_get_data_len( &view_acc ) != pre_len ) {
779788
/* https://github.com/anza-xyz/agave/blob/v3.0.4/program-runtime/src/serialization.rs#L452-L454 */
780-
int err = fd_borrowed_account_set_data_length( &view_acc, pre_len );
781-
if( FD_UNLIKELY( err ) ) {
782-
return err;
789+
int set_data_length_err = fd_borrowed_account_set_data_length( &view_acc, pre_len );
790+
if( FD_UNLIKELY( set_data_length_err ) ) {
791+
return set_data_length_err;
783792
}
784793
}
785794

0 commit comments

Comments
 (0)