fix crash in CryptoPasswordHash (#653), conversion of Rational integers in number_chars/2 (#655)

This commit is contained in:
Mark Thom
2020-08-06 00:17:55 -06:00
parent 79cf0c63c4
commit f627b32355
2 changed files with 15 additions and 2 deletions

2
Cargo.lock generated
View 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",

View 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(());
}
}
}
_ => {