From c9fe2c22fa76942d1f18ccff6b1c378f95e102c3 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Fri, 4 Sep 2020 21:53:48 +0100 Subject: [PATCH] defend against PosOffTable in spec --- src/cmdlistener.rs | 3 +++ src/spec.rs | 1 + src/updates.rs | 2 -- 3 files changed, 4 insertions(+), 2 deletions(-) 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); -- 2.30.2