@@ -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