From edde1d45f6de3e71b585b92e0e06d7499735c238 Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Sat, 22 Jun 2024 01:13:20 +0200 Subject: MacOSX: Add for using FUSE-T instead of MacFUSE The build script build_veracrypt_macosx.h now accepts the argument -f to enable fuse-t support. It is also possible to set the environment variable VC_OSX_FUSET to 1 for FUSE-T support. A change was done in CoreUnix::GetMountedVolumes to add a waiting loop for control file to be accessible because when using FUSE-T there always a delay before control file can be serialized. --- src/Core/Unix/CoreUnix.cpp | 37 ++++++++++++++++++++++++++++++------- src/Core/Unix/MacOSX/CoreMacOSX.cpp | 3 ++- 2 files changed, 32 insertions(+), 8 deletions(-) (limited to 'src/Core/Unix') diff --git a/src/Core/Unix/CoreUnix.cpp b/src/Core/Unix/CoreUnix.cpp index 26076a28..cd94b2ad 100644 --- a/src/Core/Unix/CoreUnix.cpp +++ b/src/Core/Unix/CoreUnix.cpp @@ -303,17 +303,39 @@ namespace VeraCrypt continue; shared_ptr mountedVol; - try + // Introduce a retry mechanism with a timeout for control file access + int controlFileRetries = 5; + while (controlFileRetries-- > 0) { - shared_ptr controlFile (new File); - controlFile->Open (string (mf.MountPoint) + FuseService::GetControlPath()); + try + { + shared_ptr controlFile (new File); + controlFile->Open (string (mf.MountPoint) + FuseService::GetControlPath()); - shared_ptr controlFileStream (new FileStream (controlFile)); - mountedVol = Serializable::DeserializeNew (controlFileStream); + shared_ptr controlFileStream (new FileStream (controlFile)); + mountedVol = Serializable::DeserializeNew (controlFileStream); + break; // Control file opened successfully + } + catch (const std::exception& e) + { + // if exception starts with "VeraCrypt::Serializer::ValidateName", then + // serialization is not ready yet and we need to wait before retrying + // this happens when FUSE-T is used under macOS and if it is the first time + // the volume is mounted + if (string (e.what()).find ("VeraCrypt::Serializer::ValidateName") != string::npos) + { + Thread::Sleep(250); // Wait before retrying + } + else + { + break; // Control file not found + } + } } - catch (...) + + if (!mountedVol) { - continue; + continue; // Skip to the next mounted filesystem } if (!volumePath.IsEmpty() && wstring (mountedVol->Path).compare (volumePath) != 0) @@ -700,6 +722,7 @@ namespace VeraCrypt } catch (...) { + wcout << L"Exception. Error mounting volume: " << wstring(*options.Path) << endl; try { VolumeInfoList mountedVolumes = GetMountedVolumes (*options.Path); diff --git a/src/Core/Unix/MacOSX/CoreMacOSX.cpp b/src/Core/Unix/MacOSX/CoreMacOSX.cpp index dde0d949..cfd34072 100644 --- a/src/Core/Unix/MacOSX/CoreMacOSX.cpp +++ b/src/Core/Unix/MacOSX/CoreMacOSX.cpp @@ -119,6 +119,7 @@ namespace VeraCrypt void CoreMacOSX::MountAuxVolumeImage (const DirectoryPath &auxMountPoint, const MountOptions &options) const { +#ifndef VC_MACOSX_FUSET // Check FUSE version char fuseVersionString[MAXHOSTNAMELEN + 1] = { 0 }; size_t fuseVersionStringLength = MAXHOSTNAMELEN; @@ -153,7 +154,7 @@ namespace VeraCrypt if (fuseVersionMajor < 2 || (fuseVersionMajor == 2 && fuseVersionMinor < 5)) throw HigherFuseVersionRequired (SRC_POS); - +#endif // Mount volume image string volImage = string (auxMountPoint) + FuseService::GetVolumeImagePath(); -- cgit v1.2.3