Skip to content

Commit 655625a

Browse files
committed
change math operator to saturating fn
1 parent 9a82c64 commit 655625a

File tree

2 files changed

+28
-10
lines changed

2 files changed

+28
-10
lines changed

packages/vm/src/error.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ pub enum Error {
2323
MemoryOutOfBoundError = 14, // Out-of-bound memory access while executing the wasm script
2424
UninitializedContextData = 15, // Error while getting uninitialized context data.
2525
ChecksumLengthNotMatch = 16, // Checksum not of intended length.
26+
DataLengthOutOfBound = 17, // Data length is out of bound.
2627
// Host-generated errors while interacting with OEI.
2728
WrongPeriodActionError = 128, // OEI action to invoke is not available.
2829
TooManyExternalDataError = 129, // Too many external data requests.

packages/vm/src/imports.rs

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,28 +20,31 @@ where
2020
Q: Querier + 'static,
2121
{
2222
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())
2528
}
2629

2730
fn write_memory<Q>(env: &Environment<Q>, ptr: i64, data: Vec<u8>) -> Result<i64, Error>
2831
where
2932
Q: Querier + 'static,
3033
{
3134
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)?;
3336
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);
3538
}
3639
Ok(data.len() as i64)
3740
}
3841

3942
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))
4144
}
4245

4346
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))
4548
}
4649

4750
fn do_gas<Q>(env: &Environment<Q>, _gas: u32) -> Result<(), Error>
@@ -72,7 +75,9 @@ where
7275
return Err(Error::SpanTooSmallError);
7376
}
7477

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+
)?;
7681
write_memory(env, ptr, data)
7782
})
7883
}
@@ -81,13 +86,18 @@ fn do_set_return_data<Q>(env: &Environment<Q>, ptr: i64, len: i64) -> Result<(),
8186
where
8287
Q: Querier + 'static,
8388
{
89+
if len < 0 {
90+
return Err(Error::DataLengthOutOfBound);
91+
}
8492
env.with_querier_from_context(|querier| {
8593
let span_size = querier.get_span_size();
8694

8795
if len > span_size {
8896
return Err(Error::SpanTooSmallError);
8997
}
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+
)?;
91101

92102
let data: Vec<u8> = read_memory(env, ptr, len)?;
93103
querier.set_return_data(&data)
@@ -144,13 +154,18 @@ fn do_ask_external_data<Q>(
144154
where
145155
Q: Querier + 'static,
146156
{
157+
if len < 0 {
158+
return Err(Error::DataLengthOutOfBound);
159+
}
147160
env.with_querier_from_context(|querier| {
148161
let span_size = querier.get_span_size();
149162

150163
if len > span_size {
151164
return Err(Error::SpanTooSmallError);
152165
}
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+
)?;
154169

155170
let data: Vec<u8> = read_memory(env, ptr, len)?;
156171
querier.ask_external_data(eid, did, &data)
@@ -182,7 +197,9 @@ where
182197
return Err(Error::SpanTooSmallError);
183198
}
184199

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+
)?;
186203
write_memory(env, ptr, data)
187204
})
188205
}

0 commit comments

Comments
 (0)