From: Ian Jackson Date: Fri, 4 Sep 2020 20:53:48 +0000 (+0100) Subject: defend against PosOffTable in spec X-Git-Tag: otter-0.2.0~1022 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=c9fe2c22fa76942d1f18ccff6b1c378f95e102c3;p=otter.git defend against PosOffTable in spec --- diff --git a/src/cmdlistener.rs b/src/cmdlistener.rs index 1e762809..226598c2 100644 --- a/src/cmdlistener.rs +++ b/src/cmdlistener.rs @@ -250,6 +250,9 @@ fn execute_game_insn(cs: &CommandStream, gen: gs.gen, pos, p, face, }; + if let (_, true) = pc.pos.clamped(gs.table_size) { + throw!(SpecError::PosOffTable); + } let piece = gs.pieces.insert(pc); updates.push((piece, PieceUpdateOp::Insert(()))); pos[0] += posd[0]; diff --git a/src/spec.rs b/src/spec.rs index a2e5e349..f13d6bcb 100644 --- a/src/spec.rs +++ b/src/spec.rs @@ -35,6 +35,7 @@ pub enum SpecError { UnsupportedColourSpec, FaceNotFound, InternalError(String), + PosOffTable, } display_as_debug!{SpecError} diff --git a/src/updates.rs b/src/updates.rs index 47de5eb7..559bf702 100644 --- a/src/updates.rs +++ b/src/updates.rs @@ -256,8 +256,6 @@ impl<'r> PrepareUpdatesBuffer<'r> { lens: &dyn Lens) -> PreparedUpdateEntry { let gs = &mut self.g.gs; - // xxx enforce pos is within range, everywhere - let (update, piece) = match gs.pieces.byid_mut(piece) { Ok(pc) => { gs.max_z.update_max(pc.zlevel.z);