From 3969e02837a2a2921a6feed4e0e9c576dcba4257 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Wed, 20 Jul 2022 18:03:13 -0500 Subject: [PATCH] [0.38.0] Backport CI fixes (#4491) * Fix panics in s390x codegen related to aliases This commit fixes an issue introduced as part of the fix for GHSA-5fhj-g3p3-pq9g. The `reftyped_vregs` list given to `regalloc2` is not allowed to have duplicates in it and while the list originally doesn't have duplicates once aliases are applied the list may have duplicates. The fix here is to perform another pass to remove duplicates after the aliases have been processed. * Fix a miscompile for s390x with constants This carries over a narrow fix from #4427 to prior release branches. The patch here was created by `@uweigand` during the investigation for #4487. * Add release notes --- RELEASES.md | 12 ++++++++++++ cranelift/codegen/src/isa/s390x/lower/isle.rs | 14 +++++++++++++- cranelift/codegen/src/machinst/vcode.rs | 5 +++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/RELEASES.md b/RELEASES.md index 70756efa095e..c4e237e1d8f1 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,5 +1,17 @@ -------------------------------------------------------------------------------- +## 0.38.3 + +Released 2022-07-20. + +### Fixed. + +* An s390x-specific codegen bug in addition to a mistake introduced in the fix + of CVE-2022-31146 were fixed. + [#4491](https://github.com/bytecodealliance/wasmtime/pull/4491) + +-------------------------------------------------------------------------------- + ## 0.38.2 Released 2022-07-20. diff --git a/cranelift/codegen/src/isa/s390x/lower/isle.rs b/cranelift/codegen/src/isa/s390x/lower/isle.rs index ded692c83496..6025dda33717 100644 --- a/cranelift/codegen/src/isa/s390x/lower/isle.rs +++ b/cranelift/codegen/src/isa/s390x/lower/isle.rs @@ -226,7 +226,8 @@ where fn u64_from_value(&mut self, val: Value) -> Option { let inst = self.lower_ctx.dfg().value_def(val).inst()?; let constant = self.lower_ctx.get_constant(inst)?; - Some(constant) + let ty = self.lower_ctx.output_ty(inst, 0); + Some(zero_extend_to_u64(constant, self.ty_bits(ty).unwrap())) } #[inline] @@ -516,3 +517,14 @@ where self.lower_ctx.emit(inst.clone()); } } + +/// Zero-extend the low `from_bits` bits of `value` to a full u64. +#[inline] +fn zero_extend_to_u64(value: u64, from_bits: u8) -> u64 { + assert!(from_bits <= 64); + if from_bits >= 64 { + value + } else { + value & ((1u64 << from_bits) - 1) + } +} diff --git a/cranelift/codegen/src/machinst/vcode.rs b/cranelift/codegen/src/machinst/vcode.rs index 66ab06009c77..9cb8e921523c 100644 --- a/cranelift/codegen/src/machinst/vcode.rs +++ b/cranelift/codegen/src/machinst/vcode.rs @@ -607,9 +607,14 @@ impl VCodeBuilder { // will be returned directly to `regalloc2` eventually and all // operands/results of instructions will use the alias-resolved vregs // from `regalloc2`'s perspective. + // + // Also note that `reftyped_vregs` can't have duplicates, so after the + // aliases are applied duplicates are removed. for reg in self.vcode.reftyped_vregs.iter_mut() { *reg = Self::resolve_vreg_alias_impl(&self.vcode.vreg_aliases, *reg); } + self.vcode.reftyped_vregs.sort(); + self.vcode.reftyped_vregs.dedup(); self.compute_preds_from_succs(); self.vcode.debug_value_labels.sort_unstable();