From 357ea024c00d6f918d119b0fce68aa455330c8aa Mon Sep 17 00:00:00 2001 From: Saran Tunyasuvunakool Date: Wed, 8 Jan 2025 14:30:56 -0800 Subject: [PATCH] Remove unconditional `mj_markStack` in `mjv_addGeoms`. Prior to commit 3f855f32d9b14179e17812056732d6809f0b4320, calling `mjv_updateScene` and `mjv_updateSceneFromState` on an "empty" `mjData` (one without a buffer but where all sizes are also zero) was a valid operation. The `mj_markStack` call requires free stack space, so a call to `mjv_addGeoms` on an empty `mjData` results in a stack overflow whenever `mjVIS_TENDON` is enabled. Fixes #2305. PiperOrigin-RevId: 713418586 Change-Id: I99b5de23fe94ba9aa86eeef0700c891976c9aecc --- src/engine/engine_vis_visualize.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/engine_vis_visualize.c b/src/engine/engine_vis_visualize.c index d0da232a..abcf8f34 100644 --- a/src/engine/engine_vis_visualize.c +++ b/src/engine/engine_vis_visualize.c @@ -1728,7 +1728,7 @@ void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* vopt, // spatial tendons objtype = mjOBJ_TENDON; category = mjCAT_DYNAMIC; - if (vopt->flags[mjVIS_TENDON] && (category & catmask)) { + if (vopt->flags[mjVIS_TENDON] && (category & catmask) && m->ntendon) { // mark actuated tendons mj_markStack(d); int* tendon_actuated = mjSTACKALLOC(d, m->ntendon, int);