From 8c7c39a211e2cc4c6ff693d577b1ee18afaea481 Mon Sep 17 00:00:00 2001 From: Alessio Quaglino Date: Tue, 5 Dec 2023 03:55:58 -0800 Subject: [PATCH] Lock the sim mutex in PhysicsLoop and PhysicsThread. This prevents an invalid memory access when the stack is used in engine_vis. Fixes #1219. PiperOrigin-RevId: 588017796 Change-Id: I1ee18c5aa5e96ccaeebb0a467cd384355882b80b --- simulate/main.cc | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/simulate/main.cc b/simulate/main.cc index 57763646..f23a0e30 100644 --- a/simulate/main.cc +++ b/simulate/main.cc @@ -267,6 +267,9 @@ void PhysicsLoop(mj::Simulate& sim) { if (dnew) { sim.Load(mnew, dnew, sim.dropfilename); + // lock the sim mutex + const std::unique_lock lock(sim.mtx); + mj_deleteData(d); mj_deleteModel(m); @@ -292,6 +295,9 @@ void PhysicsLoop(mj::Simulate& sim) { if (dnew) { sim.Load(mnew, dnew, sim.filename); + // lock the sim mutex + const std::unique_lock lock(sim.mtx); + mj_deleteData(d); mj_deleteModel(m); @@ -421,9 +427,18 @@ void PhysicsThread(mj::Simulate* sim, const char* filename) { if (filename != nullptr) { sim->LoadMessage(filename); m = LoadModel(filename, *sim); - if (m) d = mj_makeData(m); + if (m) { + // lock the sim mutex + const std::unique_lock lock(sim->mtx); + + d = mj_makeData(m); + } if (d) { sim->Load(m, d, filename); + + // lock the sim mutex + const std::unique_lock lock(sim->mtx); + mj_forward(m, d); // allocate ctrlnoise