chiark / gitweb /
defend against PosOffTable in spec
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 4 Sep 2020 20:53:48 +0000 (21:53 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 4 Sep 2020 20:53:48 +0000 (21:53 +0100)
src/cmdlistener.rs
src/spec.rs
src/updates.rs

index 1e76280926c49e71dc48e0232c8bd7a416628816..226598c2121419b0316474a7fba6aa5d81879d1e 100644 (file)
@@ -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];
index a2e5e34975b6a2b8153082f3cc1d857fc485d135..f13d6bcbb466800ce194cd3503b036d9c19c9e84 100644 (file)
@@ -35,6 +35,7 @@ pub enum SpecError {
   UnsupportedColourSpec,
   FaceNotFound,
   InternalError(String),
+  PosOffTable,
 }
 display_as_debug!{SpecError}
 
index 47de5eb71ef7306f7fb0594598bc8c3648eb5c5c..559bf702a15c779c4d8b4524a449d3def8b5a01f 100644 (file)
@@ -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);