From f627b323550dc104b2331454b6b942d89d72949c Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Thu, 6 Aug 2020 00:17:55 -0600 Subject: [PATCH] fix crash in CryptoPasswordHash (#653), conversion of Rational integers in number_chars/2 (#655) --- Cargo.lock | 2 ++ src/machine/system_calls.rs | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6f819538..6f1db7a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -906,6 +906,8 @@ dependencies = [ [[package]] name = "prolog_parser" version = "0.8.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f16bb270c3f20e0ccd6e0b7f1367d4a1ac9070227e40733512913cdf24fe9152" dependencies = [ "lexical", "num-rug-adapter", diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index ada49a0f..df2187d1 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -1675,6 +1675,12 @@ impl MachineState { Ok(Number::Integer(n)) => { n.to_string() } + Ok(Number::Rational(r)) => { + // n has already been confirmed as an integer, and + // internally, Rational is assumed reduced, so its denominator + // must be 1. + r.numer().to_string() + } _ => { unreachable!() } @@ -5502,15 +5508,20 @@ impl MachineState { let stub2 = MachineError::functor_stub(clause_name!("crypto_password_hash"), 3); let salt = self.integers_to_bytevec(temp_v!(2), stub2); + let iterations = self.store(self.deref(self[temp_v!(3)])); + let iterations = - match Number::try_from((self[temp_v!(3)], &self.heap)) { + match Number::try_from((iterations, &self.heap)) { Ok(Number::Fixnum(n)) => { u64::try_from(n).unwrap() } Ok(Number::Integer(n)) => { match n.to_u64() { Some(i) => { i } - None => { self.fail = true; return Ok(()); } + None => { + self.fail = true; + return Ok(()); + } } } _ => { -- 2.54.0