Fix memory and resource leaks in failing resource provider open callbacks

When an mjpResourceProvider's open callback returns 0 (failure), MuJoCo does
not invoke the corresponding close callback. Previously, several resource
provider implementations allocated heap memory or system file handles before
encountering an error, failing to clean them up before returning 0. This change addresses these leaks across the codebase and clarifies the API contract.

PiperOrigin-RevId: 929803942
Change-Id: Ib7344033726895cdf037a8d9356ffc183c78c2d3
This commit is contained in:
Matija Kecman
2026-06-10 06:06:12 -07:00
committed by Copybara-Service
parent c31e94cee6
commit edbe6a6f74
4 changed files with 17 additions and 5 deletions
@@ -79,6 +79,10 @@ class Viewer {
resource_provider.open = [](mjResource* resource) {
auto* data = new ResourceData();
data->bytes = LoadAsset(resource->name);
if (data->bytes.empty()) {
delete data;
return 0;
}
resource->data = data;
return static_cast<int>(data->bytes.size());
};
@@ -135,9 +139,7 @@ class Viewer {
bytes_per_pixel);
}
std::string GetDropFile() {
return window_->GetDropFile();
}
std::string GetDropFile() { return window_->GetDropFile(); }
void Present(const mujoco::python::MjModelWrapper& model,
mujoco::python::MjDataWrapper& data,