From 9e0885a4fab5665bdeb3ca7c54bab5f51db5c6dc Mon Sep 17 00:00:00 2001 From: Kyle Bayes Date: Fri, 10 Oct 2025 10:02:44 -0700 Subject: [PATCH] Handle exceptions in VFS C API. PiperOrigin-RevId: 817688877 Change-Id: Ia2e306fe4cd1848eb5731212aa4e959080a9d377 --- src/user/user_util.cc | 8 +++++++- src/user/user_vfs.cc | 7 ++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/user/user_util.cc b/src/user/user_util.cc index 5df993d4..0099dbcc 100644 --- a/src/user/user_util.cc +++ b/src/user/user_util.cc @@ -1140,7 +1140,13 @@ std::vector FileToMemory(const char* filename) { return {}; } - std::vector buffer(long_filesize); + std::vector buffer; + try { + buffer.resize(long_filesize); + } catch (...) { + fclose(fp); + return {}; + } // go back to start of file if (fseek(fp, 0, SEEK_SET) != 0) { diff --git a/src/user/user_vfs.cc b/src/user/user_vfs.cc index 80e1f323..4b4a736a 100644 --- a/src/user/user_vfs.cc +++ b/src/user/user_vfs.cc @@ -251,7 +251,12 @@ int mj_addBufferVFS(mjVFS* vfs, const char* name, const void* buffer, if (!(file = cvfs->AddFile(FilePath(name), std::move(inbuffer), 0))) { return 2; // AddFile failed, repeated name } - file->filedata.reserve(nbuffer); + try { + file->filedata.reserve(nbuffer); + } catch (...) { + cvfs->DeleteFile(file->filename); // delete file on error + return -1; + } file->filestamp = vfs_memcpy(file->filedata, buffer, nbuffer); return 0; }