Fix potential out-of-range write in solver statistics saving.

PiperOrigin-RevId: 569094007
Change-Id: I2e596a7c03d76523359cae7ae7f4501b06256a38
This commit is contained in:
Yuval Tassa
2023-09-28 00:57:19 -07:00
committed by Copybara-Service
parent b8a91a00ce
commit 772326e9eb
+10 -3
View File
@@ -37,7 +37,7 @@
static void saveStats(const mjModel* m, mjData* d, int island, int iter,
mjtNum improvement, mjtNum gradient, mjtNum lineslope,
int nactive, int nchange, int neval, int nupdate) {
// if out of range, return
// if island out of range, return
if (island >= mjNISLAND) {
return;
}
@@ -45,8 +45,12 @@ static void saveStats(const mjModel* m, mjData* d, int island, int iter,
// if no islands, use first island
island = mjMAX(0, island);
// if iter out of range, return
if (iter >= mjNSOLVER) {
return;
}
// get mjSolverStat pointer
iter += d->solver_niter[island]; // add current niter (in case of noslip)
mjSolverStat* stat = d->solver + island*mjNSOLVER + iter;
// save stats
@@ -712,7 +716,10 @@ void mj_solNoSlip(const mjModel* m, mjData* d, int maxiter) {
// scale improvement, save stats
improvement *= scale;
saveStats(m, d, island, iter, improvement, 0, 0, nactive, nchange, 0, 0);
// save noslip stats after all the entries from regular solver
int stats_iter = iter + d->solver_niter[island];
saveStats(m, d, island, stats_iter, improvement, 0, 0, nactive, nchange, 0, 0);
// increment iteration count
iter++;