@@ -67,24 +67,27 @@ function calldatacopy(x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4) {
6767 let cds:i32 := eth.getCallDataSize ()
6868 let destination:i32 := u256_to_i32 (x1, x2, x3, x4)
6969 let offset:i32 := u256_to_i32 (y1, y2, y3, y4)
70- let size:i32 := u256_to_i32 (z1, z2, z3, z4)
71- let copy_size:i32 := size
70+ let requested_size:i32 := u256_to_i32 (z1, z2, z3, z4)
7271 // overflow?
73- if i32.gt_u (offset, i32.sub (0xffffffff :i32, size )) {
72+ if i32.gt_u (offset, i32.sub (0xffffffff :i32, requested_size )) {
7473 eth.revert (0 :i32, 0 :i32)
7574 }
76- if i32.gt_u (i32.add (offset, size), cds) {
77- copy_size := i32.sub (cds, offset)
75+
76+ let available_size := i32.sub (cds, offset)
77+ if i32.lt_u (offset, cds) {
78+ available_size := 0 :i32
7879 }
79- if i32.gt_u (copy_size, 0 :i32) {
80+
81+ if i32.gt_u (available_size, 0 :i32) {
8082 eth.callDataCopy (
8183 destination,
8284 offset,
83- copy_size
85+ available_size
8486 )
8587 }
86- if i32.gt_u (size, copy_size) {
87- memset (i32.add (destination, copy_size), 0 :i32, i32.sub (size, copy_size))
88+
89+ if i32.gt_u (requested_size, available_size) {
90+ memset (i32.add (destination, available_size), 0 :i32, i32.sub (requested_size, available_size))
8891 }
8992}
9093
0 commit comments