From 0743ed631efe63ae2de96847df7b7fce629127b6 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 10 Aug 2019 11:27:27 +0200 Subject: [PATCH] clamp ldexp exponent to i16 --- src/shims/foreign_items.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/shims/foreign_items.rs b/src/shims/foreign_items.rs index add6bd5bbef..4cca6b9efdd 100644 --- a/src/shims/foreign_items.rs +++ b/src/shims/foreign_items.rs @@ -597,7 +597,16 @@ fn emulate_foreign_item( "_ldexp" | "ldexp" | "scalbn" => { let x = this.read_scalar(args[0])?.to_f64()?; let exp = this.read_scalar(args[1])?.to_i32()?; - let res = x.scalbn(exp.try_into().unwrap()); + // Saturating cast to i16. Even those are outside the valid exponent range to + // `scalbn` below will to its over/underflow handling. + let exp = if exp > i16::max_value() as i32 { + i16::max_value() + } else if exp < i16::min_value() as i32 { + i16::min_value() + } else { + exp.try_into().unwrap() + }; + let res = x.scalbn(exp); this.write_scalar(Scalar::from_f64(res), dest)?; } -- 2.44.0