]> Repositorios git - scryer-prolog.git/commitdiff
fix crash in CryptoPasswordHash (#653), conversion of Rational integers in number_cha...
authorMark Thom <[email protected]>
Thu, 6 Aug 2020 06:17:55 +0000 (00:17 -0600)
committerMark Thom <[email protected]>
Thu, 6 Aug 2020 06:17:55 +0000 (00:17 -0600)
Cargo.lock
src/machine/system_calls.rs

index 6f819538e409426729e2ac9ec8271cabc21c733a..6f1db7a88c16e51fab66e592d4ba34dd8a7c8853 100644 (file)
@@ -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",
index ada49a0ff9674945f524173e7133b11203cc5d5e..df2187d1a3410841cb1e51dac772f0bf6e37ccd4 100644 (file)
@@ -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(());
+                                }
                             }
                         }
                         _ => {