Copy arena contents in mj_copyData.

Fixes #1710.

PiperOrigin-RevId: 651351384
Change-Id: I56e3204b30bb18f48278117e85e90464177da973
This commit is contained in:
Nimrod Gileadi
2024-07-11 03:53:45 -07:00
committed by Copybara-Service
parent f9ab89b205
commit e7301edd20
3 changed files with 23 additions and 1 deletions
+15 -1
View File
@@ -1265,10 +1265,24 @@ mjData* mj_copyData(mjData* dest, const mjModel* m, const mjData* src) {
}
// copy arena memory
#undef MJ_D
#define MJ_D(n) (src->n)
#undef MJ_M
#define MJ_M(n) (m->n)
#define X(type, name, nr, nc) \
dest->name = src->name ? (type*)((char*)dest->arena + PTRDIFF(src->name, src->arena)) : NULL;
if (src->name) { \
dest->name = (type*)((char*)dest->arena + PTRDIFF(src->name, src->arena)); \
memcpy((char*)dest->name, (const char*)src->name, sizeof(type)*nr*nc); \
} else { \
dest->name = NULL; \
}
MJDATA_ARENA_POINTERS
#undef X
#undef MJ_M
#define MJ_M(n) n
#undef MJ_D
#define MJ_D(n) n
// restore contact pointer
dest->contact = dest->arena;