From 3cf0f447beb4539a374e2c4d9d903fa2f9617995 Mon Sep 17 00:00:00 2001 From: Claudia Richoux Date: Thu, 9 Dec 2021 17:45:55 -0600 Subject: [PATCH 1/3] overflow protection in charge_gas --- vm/interpreter/src/gas_tracker/mod.rs | 31 ++++++++++++++++++--------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/vm/interpreter/src/gas_tracker/mod.rs b/vm/interpreter/src/gas_tracker/mod.rs index 1c680441276..c512956d7c2 100644 --- a/vm/interpreter/src/gas_tracker/mod.rs +++ b/vm/interpreter/src/gas_tracker/mod.rs @@ -25,16 +25,27 @@ impl GasTracker { /// enough gas remaining for charge. pub fn charge_gas(&mut self, charge: GasCharge) -> Result<(), ActorError> { let to_use = charge.total(); - let used = self.gas_used + to_use; - if used > self.gas_available { - self.gas_used = self.gas_available; - Err(actor_error!(SysErrOutOfGas; - "not enough gas (used={}) (available={})", - used, self.gas_available - )) - } else { - self.gas_used += to_use; - Ok(()) + let used_or = self.gas_used.checked_add(to_use); + match used_or { + None => { + self.gas_used = self.gas_available; + Err(actor_error!(SysErrOutOfGas; + "adding gas_used={} and to_use={} overflowed", + self.gas_used, to_use + )) + } + Some(used) => { + if used > self.gas_available { + self.gas_used = self.gas_available; + Err(actor_error!(SysErrOutOfGas; + "not enough gas (used={}) (available={})", + used, self.gas_available + )) + } else { + self.gas_used += to_use; + Ok(()) + } + } } } From a03ec8ec8fb7d178f48d2a89e14d31005f8f0ea1 Mon Sep 17 00:00:00 2001 From: Claudia Richoux Date: Fri, 10 Dec 2021 14:27:40 -0600 Subject: [PATCH 2/3] fixing overflow protection to be like in lotus --- vm/interpreter/src/gas_tracker/mod.rs | 31 +++++++++------------------ 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/vm/interpreter/src/gas_tracker/mod.rs b/vm/interpreter/src/gas_tracker/mod.rs index c512956d7c2..160e506c058 100644 --- a/vm/interpreter/src/gas_tracker/mod.rs +++ b/vm/interpreter/src/gas_tracker/mod.rs @@ -25,27 +25,16 @@ impl GasTracker { /// enough gas remaining for charge. pub fn charge_gas(&mut self, charge: GasCharge) -> Result<(), ActorError> { let to_use = charge.total(); - let used_or = self.gas_used.checked_add(to_use); - match used_or { - None => { - self.gas_used = self.gas_available; - Err(actor_error!(SysErrOutOfGas; - "adding gas_used={} and to_use={} overflowed", - self.gas_used, to_use - )) - } - Some(used) => { - if used > self.gas_available { - self.gas_used = self.gas_available; - Err(actor_error!(SysErrOutOfGas; - "not enough gas (used={}) (available={})", - used, self.gas_available - )) - } else { - self.gas_used += to_use; - Ok(()) - } - } + + if self.gas_used > self.gas_available-to_use { + self.gas_used = self.gas_available; + Err(actor_error!(SysErrOutOfGas; + "not enough gas (used={}) (available={})", + to_use, self.gas_available + )) + } else { + self.gas_used += to_use; + Ok(()) } } From 2ed9d3d2085ad594571459af2a5fdd232b6cba3b Mon Sep 17 00:00:00 2001 From: Claudia Richoux Date: Tue, 14 Dec 2021 12:16:05 -0600 Subject: [PATCH 3/3] linters --- vm/interpreter/src/gas_tracker/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vm/interpreter/src/gas_tracker/mod.rs b/vm/interpreter/src/gas_tracker/mod.rs index 160e506c058..1fe895650c2 100644 --- a/vm/interpreter/src/gas_tracker/mod.rs +++ b/vm/interpreter/src/gas_tracker/mod.rs @@ -26,7 +26,7 @@ impl GasTracker { pub fn charge_gas(&mut self, charge: GasCharge) -> Result<(), ActorError> { let to_use = charge.total(); - if self.gas_used > self.gas_available-to_use { + if self.gas_used > self.gas_available - to_use { self.gas_used = self.gas_available; Err(actor_error!(SysErrOutOfGas; "not enough gas (used={}) (available={})",