From 78b9b7808ea44b83b32bee9e2eaf5ce0e0f5c9ee Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 29 Oct 2025 11:13:26 +0100 Subject: [PATCH] try to fix access violation --- src/core/file_sys/vfs/vfs_real.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/core/file_sys/vfs/vfs_real.cpp b/src/core/file_sys/vfs/vfs_real.cpp index 4199667171..22443ac53f 100644 --- a/src/core/file_sys/vfs/vfs_real.cpp +++ b/src/core/file_sys/vfs/vfs_real.cpp @@ -203,7 +203,7 @@ std::unique_lock RealVfsFilesystem::RefreshReference(const std::stri FileReference& reference) { std::unique_lock lk{list_lock}; - // Temporarily remove from list. + // Temporarily remove from list (regardless of the current list). this->RemoveReferenceFromListLocked(reference); // Restore file if needed. @@ -226,7 +226,7 @@ std::unique_lock RealVfsFilesystem::RefreshReference(const std::stri void RealVfsFilesystem::DropReference(std::unique_ptr&& reference) { std::scoped_lock lk{list_lock}; - // Remove from list. + // Remove from list if present. this->RemoveReferenceFromListLocked(*reference); // Close the file. @@ -256,6 +256,12 @@ void RealVfsFilesystem::EvictSingleReferenceLocked() { } void RealVfsFilesystem::InsertReferenceIntoListLocked(FileReference& reference) { + // Ensure the node is not already linked to any list before inserting. + if (reference.IsLinked()) { + // Unlink from whichever list it currently belongs to. + open_references.erase(open_references.iterator_to(reference)); + } + if (reference.file) { open_references.push_front(reference); } else { @@ -264,11 +270,13 @@ void RealVfsFilesystem::InsertReferenceIntoListLocked(FileReference& reference) } void RealVfsFilesystem::RemoveReferenceFromListLocked(FileReference& reference) { - if (reference.file) { - open_references.erase(open_references.iterator_to(reference)); - } else { - closed_references.erase(closed_references.iterator_to(reference)); + // Unlink from whichever list the node currently belongs to, if any. + if (!reference.IsLinked()) { + return; } + + // It's safe to erase via either list since erase only uses the node's links. + open_references.erase(open_references.iterator_to(reference)); } RealVfsFile::RealVfsFile(RealVfsFilesystem& base_, std::unique_ptr reference_,