@@ -20,28 +20,31 @@ where
20
20
Q : Querier + ' static ,
21
21
{
22
22
let memory = env. memory ( ) ?;
23
- require_mem_range ( memory. size ( ) . bytes ( ) . 0 , ( ptr + len) as usize ) ?;
24
- Ok ( memory. view ( ) [ ptr as usize ..( ptr + len) as usize ] . iter ( ) . map ( |cell| cell. get ( ) ) . collect ( ) )
23
+ require_mem_range ( memory. size ( ) . bytes ( ) . 0 , ( ptr. saturating_add ( len) ) as usize ) ?;
24
+ Ok ( memory. view ( ) [ ptr as usize ..( ptr. saturating_add ( len) ) as usize ]
25
+ . iter ( )
26
+ . map ( |cell| cell. get ( ) )
27
+ . collect ( ) )
25
28
}
26
29
27
30
fn write_memory < Q > ( env : & Environment < Q > , ptr : i64 , data : Vec < u8 > ) -> Result < i64 , Error >
28
31
where
29
32
Q : Querier + ' static ,
30
33
{
31
34
let memory = env. memory ( ) ?;
32
- require_mem_range ( memory. size ( ) . bytes ( ) . 0 , ( ptr + data. len ( ) as i64 ) as usize ) ?;
35
+ require_mem_range ( memory. size ( ) . bytes ( ) . 0 , ( ptr. saturating_add ( data. len ( ) as i64 ) ) as usize ) ?;
33
36
for ( idx, byte) in data. iter ( ) . enumerate ( ) {
34
- memory. view ( ) [ ptr as usize + idx] . set ( * byte) ;
37
+ memory. view ( ) [ ( ptr as usize ) . saturating_add ( idx) ] . set ( * byte) ;
35
38
}
36
39
Ok ( data. len ( ) as i64 )
37
40
}
38
41
39
42
fn calculate_read_memory_gas ( len : i64 ) -> u64 {
40
- 1_000_000_000 + ( len as u64 ) * 1_500_000
43
+ 1_000_000_000_u64 . saturating_add ( ( len as u64 ) . saturating_mul ( 1_500_000 ) )
41
44
}
42
45
43
46
fn calculate_write_memory_gas ( len : usize ) -> u64 {
44
- 2_250_000_000 + ( len as u64 ) * 30_000_000
47
+ 2_250_000_000_u64 . saturating_add ( ( len as u64 ) . saturating_mul ( 30_000_000 ) )
45
48
}
46
49
47
50
fn do_gas < Q > ( env : & Environment < Q > , _gas : u32 ) -> Result < ( ) , Error >
72
75
return Err ( Error :: SpanTooSmallError ) ;
73
76
}
74
77
75
- env. decrease_gas_left ( IMPORTED_FUNCTION_GAS + calculate_write_memory_gas ( data. len ( ) ) ) ?;
78
+ env. decrease_gas_left (
79
+ IMPORTED_FUNCTION_GAS . saturating_add ( calculate_write_memory_gas ( data. len ( ) ) ) ,
80
+ ) ?;
76
81
write_memory ( env, ptr, data)
77
82
} )
78
83
}
@@ -81,13 +86,18 @@ fn do_set_return_data<Q>(env: &Environment<Q>, ptr: i64, len: i64) -> Result<(),
81
86
where
82
87
Q : Querier + ' static ,
83
88
{
89
+ if len < 0 {
90
+ return Err ( Error :: DataLengthOutOfBound ) ;
91
+ }
84
92
env. with_querier_from_context ( |querier| {
85
93
let span_size = querier. get_span_size ( ) ;
86
94
87
95
if len > span_size {
88
96
return Err ( Error :: SpanTooSmallError ) ;
89
97
}
90
- env. decrease_gas_left ( IMPORTED_FUNCTION_GAS + calculate_read_memory_gas ( len) ) ?;
98
+ env. decrease_gas_left (
99
+ IMPORTED_FUNCTION_GAS . saturating_add ( calculate_read_memory_gas ( len) ) ,
100
+ ) ?;
91
101
92
102
let data: Vec < u8 > = read_memory ( env, ptr, len) ?;
93
103
querier. set_return_data ( & data)
@@ -144,13 +154,18 @@ fn do_ask_external_data<Q>(
144
154
where
145
155
Q : Querier + ' static ,
146
156
{
157
+ if len < 0 {
158
+ return Err ( Error :: DataLengthOutOfBound ) ;
159
+ }
147
160
env. with_querier_from_context ( |querier| {
148
161
let span_size = querier. get_span_size ( ) ;
149
162
150
163
if len > span_size {
151
164
return Err ( Error :: SpanTooSmallError ) ;
152
165
}
153
- env. decrease_gas_left ( IMPORTED_FUNCTION_GAS + calculate_read_memory_gas ( len) ) ?;
166
+ env. decrease_gas_left (
167
+ IMPORTED_FUNCTION_GAS . saturating_add ( calculate_read_memory_gas ( len) ) ,
168
+ ) ?;
154
169
155
170
let data: Vec < u8 > = read_memory ( env, ptr, len) ?;
156
171
querier. ask_external_data ( eid, did, & data)
@@ -182,7 +197,9 @@ where
182
197
return Err ( Error :: SpanTooSmallError ) ;
183
198
}
184
199
185
- env. decrease_gas_left ( IMPORTED_FUNCTION_GAS + calculate_write_memory_gas ( data. len ( ) ) ) ?;
200
+ env. decrease_gas_left (
201
+ IMPORTED_FUNCTION_GAS . saturating_add ( calculate_write_memory_gas ( data. len ( ) ) ) ,
202
+ ) ?;
186
203
write_memory ( env, ptr, data)
187
204
} )
188
205
}
0 commit comments