chiark / gitweb /
occult ilks: Fix a theoretical leak
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 15 May 2021 15:48:11 +0000 (16:48 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 15 May 2021 16:17:19 +0000 (17:17 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
daemon/cmdlistener.rs

index 319446349ee1833ce2d2110f06962a9b817378b5..41532f36e4a7711bccf381766ff98d7ece5be557 100644 (file)
@@ -968,18 +968,20 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>(
           throw!(SpecError::FaceNotFound);
         }
         let gs = &mut ig.gs;
-        let ilks = &mut ig.ioccults.ilks;
-        let occilk = occultable.map(|(ilkname, p_occ)| {
-          ilks.insert(ilkname, OccultIlkData { p_occ })
-        });
         gpc.pos.clamped(gs.table_size)?;
         if gpc.zlevel > gs.max_z { gs.max_z = gpc.zlevel.clone() }
         let piece = gs.pieces.as_mut(modperm).insert(gpc);
         let p = IPieceTraitObj::new(p);
-        ig.ipieces.as_mut(modperm).insert(piece, IPiece {
-          p, occilk, loaded_via_alias,
-        });
-        updates.push((piece, PieceUpdateOp::Insert(())));
+        (||{
+          let ilks = &mut ig.ioccults.ilks;
+          let occilk = occultable.map(|(ilkname, p_occ)| {
+            ilks.insert(ilkname, OccultIlkData { p_occ })
+          });
+          ig.ipieces.as_mut(modperm).insert(piece, IPiece {
+            p, occilk, loaded_via_alias,
+          });
+          updates.push((piece, PieceUpdateOp::Insert(())));
+        })(); // <- no ?, infallible (to avoid leaking ilk)
         pos = (pos + posd)?;
       }