@@ -803,7 +803,7 @@ fd_vm_syscall_sol_memset( /**/ void * _vm,
803
803
ulong bytes_in_cur_region = fd_ulong_sat_sub ( vm -> input_mem_regions [ region_idx ].region_sz , offset_in_cur_region );
804
804
805
805
/* Check that current region is writable */
806
- if ( FD_UNLIKELY ( !vm -> input_mem_regions [ region_idx ].is_writable && sz ) ) {
806
+ if ( FD_UNLIKELY ( !vm -> input_mem_regions [ region_idx ].is_writable ) ) {
807
807
FD_VM_ERR_FOR_LOG_EBPF ( vm , FD_VM_ERR_EBPF_ACCESS_VIOLATION );
808
808
return FD_VM_SYSCALL_ERR_SEGFAULT ;
809
809
}
@@ -816,6 +816,10 @@ fd_vm_syscall_sol_memset( /**/ void * _vm,
816
816
fd_memset ( haddr , b , num_bytes_to_set );
817
817
sz -= num_bytes_to_set ;
818
818
819
+ if ( !sz ) {
820
+ break ;
821
+ }
822
+
819
823
/* If no more regions left, break. */
820
824
if ( ++ region_idx == vm -> input_mem_regions_cnt ) {
821
825
break ;
@@ -828,7 +832,7 @@ fd_vm_syscall_sol_memset( /**/ void * _vm,
828
832
829
833
/* If new region crosses into/out of account region, error out. */
830
834
if ( FD_UNLIKELY ( vm -> input_mem_regions [ region_idx ].is_acct_data !=
831
- vm -> input_mem_regions [ region_idx - 1UL ].is_acct_data && sz ) ) {
835
+ vm -> input_mem_regions [ region_idx - 1UL ].is_acct_data ) ) {
832
836
FD_VM_ERR_FOR_LOG_SYSCALL ( vm , FD_VM_SYSCALL_ERR_INVALID_LENGTH );
833
837
return FD_VM_SYSCALL_ERR_SEGFAULT ;
834
838
}
0 commit comments