diff --git a/vm/src/obj/objbytes.rs b/vm/src/obj/objbytes.rs index 18d8a7698d..69eeaa2ea6 100644 --- a/vm/src/obj/objbytes.rs +++ b/vm/src/obj/objbytes.rs @@ -418,13 +418,12 @@ impl PyBytes { } #[pymethod(name = "__mul__")] - fn repeat(&self, n: isize) -> PyBytes { - self.inner.repeat(n).into() - } - #[pymethod(name = "__rmul__")] - fn rmul(&self, n: isize) -> PyBytes { - self.repeat(n) + fn repeat(&self, value: isize, vm: &VirtualMachine) -> PyResult { + if value > 0 && self.inner.len() as isize > std::isize::MAX / value { + return Err(vm.new_overflow_error("repeated bytes are too long".to_owned())); + } + Ok(self.inner.repeat(value).into()) } fn do_cformat( diff --git a/vm/src/obj/objstr.rs b/vm/src/obj/objstr.rs index c1e698609c..0996bf279c 100644 --- a/vm/src/obj/objstr.rs +++ b/vm/src/obj/objstr.rs @@ -333,19 +333,9 @@ impl PyString { } #[pymethod(name = "__mul__")] - fn mul(&self, multiplier: isize, vm: &VirtualMachine) -> PyResult { - multiplier - .max(0) - .to_usize() - .map(|multiplier| self.value.repeat(multiplier)) - .ok_or_else(|| { - vm.new_overflow_error("cannot fit 'int' into an index-sized integer".to_owned()) - }) - } - #[pymethod(name = "__rmul__")] - fn rmul(&self, val: isize, vm: &VirtualMachine) -> PyResult { - self.mul(val, vm) + fn mul(&self, value: isize) -> String { + self.value.repeat(value.max(0) as usize) } #[pymethod(name = "__str__")]