mirror of
https://github.com/veracrypt/VeraCrypt.git
synced 2026-06-17 01:56:10 -05:00
Linux/macOS: fix hidden volume FAT size limit
The Unix volume creation wizard applied the FAT32 sector-count limit as a blanket check for device-hosted hidden-volume outer volumes. On 512e disks Linux reports 512-byte logical sectors, so this incorrectly rejected larger device-hosted outer volumes even when the selected outer filesystem was not FAT. Compute the actual VeraCrypt filesystem/data area size through a shared helper and apply the FAT32 size limit only when FAT is selected. This preserves correct FAT validation while allowing non-FAT outer volumes to proceed to the existing hidden-volume size estimation flow. Update text-mode creation so FAT is not offered when the selected size cannot support it, and default to the platform native filesystem in that case. Clarify the user-facing FAT limit wording to refer to logical sector size. Fixes #262
This commit is contained in:
@@ -1517,10 +1517,6 @@
|
||||
<entry lang="en" key="LINUX_MOUNTET_HINT">The filesystem of the selected device is currently mounted. Please unmount '{0}' before proceeding.</entry>
|
||||
<entry lang="en" key="LINUX_HIDDEN_PASS_NO_DIFF">The Hidden volume can't have the same password, PIM and keyfiles as the Outer volume</entry>
|
||||
<entry lang="en" key="LINUX_NOT_FAT_HINT">Please note that the volume will not be formatted with a FAT filesystem and, therefore, you may be required to install additional filesystem drivers on platforms other than {0}, which will enable you to mount the volume.</entry>
|
||||
<entry lang="en" key="LINUX_ERROR_SIZE_HIDDEN_VOL">Error: The hidden volume to be created is larger than {0} TB ({1} GB).\n\nPossible solutions:\n- Create a container/partition smaller than {0} TB.\n</entry>
|
||||
<entry lang="en" key="LINUX_MAX_SIZE_HINT">- Use a drive with 4096-byte sectors to be able to create partition/device-hosted hidden volumes up to 16 TB in size</entry>
|
||||
<entry lang="en" key="LINUX_DOT_LF">.\n</entry>
|
||||
<entry lang="en" key="LINUX_NOT_SUPPORTED"> (not supported by components available on this platform).\n</entry>
|
||||
<entry lang="en" key="LINUX_KERNEL_OLD">Your system uses an old version of the Linux kernel.\n\nDue to a bug in the Linux kernel, your system may stop responding when writing data to a VeraCrypt volume. This problem can be solved by upgrading the kernel to version 2.6.24 or later.</entry>
|
||||
<entry lang="en" key="LINUX_VOL_UNMOUNTED">Volume {0} has been unmounted.</entry>
|
||||
<entry lang="en" key="LINUX_VOL_MOUNTED">Volume {0} has been mounted.</entry>
|
||||
|
||||
@@ -436,6 +436,14 @@ namespace VeraCrypt
|
||||
burn (&OuterPim, sizeof (OuterPim));
|
||||
}
|
||||
|
||||
uint64 VolumeCreationWizard::GetSelectedVolumeFilesystemSize () const
|
||||
{
|
||||
if (OuterVolume || SelectedVolumeType != VolumeType::Hidden)
|
||||
return VolumeLayoutV2Normal().GetMaxDataSize (VolumeSize);
|
||||
|
||||
return VolumeLayoutV2Hidden().GetMaxDataSize (VolumeSize);
|
||||
}
|
||||
|
||||
WizardPage *VolumeCreationWizard::GetPage (WizardStep step)
|
||||
{
|
||||
switch (step)
|
||||
@@ -595,8 +603,7 @@ namespace VeraCrypt
|
||||
|
||||
case Step::FormatOptions:
|
||||
{
|
||||
shared_ptr <VolumeLayout> layout ((OuterVolume || SelectedVolumeType != VolumeType::Hidden)? (VolumeLayout*) new VolumeLayoutV2Normal() : (VolumeLayout*) new VolumeLayoutV2Hidden());
|
||||
uint64 filesystemSize = layout->GetMaxDataSize (VolumeSize);
|
||||
uint64 filesystemSize = GetSelectedVolumeFilesystemSize ();
|
||||
bool hiddenVolumeItself = !OuterVolume && SelectedVolumeType == VolumeType::Hidden;
|
||||
bool normalFileContainer = !OuterVolume && SelectedVolumeType == VolumeType::Normal && SelectedVolumeHostType == VolumeHostType::File;
|
||||
bool existingDeviceSupportedCase = SelectedVolumePath.IsDevice() && !hiddenVolumeItself;
|
||||
@@ -1231,9 +1238,10 @@ namespace VeraCrypt
|
||||
}
|
||||
}
|
||||
|
||||
if (VolumeSize > 4 * BYTES_PER_GB)
|
||||
uint64 filesystemSize = GetSelectedVolumeFilesystemSize ();
|
||||
if (filesystemSize > 4 * BYTES_PER_GB)
|
||||
{
|
||||
if (VolumeSize <= TC_MAX_FAT_SECTOR_COUNT * SectorSize)
|
||||
if (filesystemSize <= TC_MAX_FAT_SECTOR_COUNT * (uint64) SectorSize)
|
||||
return Step::LargeFilesSupport;
|
||||
else
|
||||
SelectedFilesystemType = VolumeCreationOptions::FilesystemType::GetPlatformNative();
|
||||
@@ -1307,9 +1315,10 @@ namespace VeraCrypt
|
||||
}
|
||||
}
|
||||
|
||||
if (VolumeSize > 4 * BYTES_PER_GB)
|
||||
uint64 filesystemSize = GetSelectedVolumeFilesystemSize ();
|
||||
if (filesystemSize > 4 * BYTES_PER_GB)
|
||||
{
|
||||
if (VolumeSize <= TC_MAX_FAT_SECTOR_COUNT * SectorSize)
|
||||
if (filesystemSize <= TC_MAX_FAT_SECTOR_COUNT * (uint64) SectorSize)
|
||||
return Step::LargeFilesSupport;
|
||||
else
|
||||
SelectedFilesystemType = VolumeCreationOptions::FilesystemType::GetPlatformNative();
|
||||
@@ -1394,23 +1403,14 @@ namespace VeraCrypt
|
||||
{
|
||||
if (SelectedVolumeType != VolumeType::Hidden || OuterVolume)
|
||||
{
|
||||
if (SelectedVolumePath.IsDevice() && OuterVolume && VolumeSize > TC_MAX_FAT_SECTOR_COUNT * SectorSize)
|
||||
if (SelectedFilesystemType == VolumeCreationOptions::FilesystemType::FAT)
|
||||
{
|
||||
uint64 limit = TC_MAX_FAT_SECTOR_COUNT * SectorSize / BYTES_PER_TB;
|
||||
wstring err = static_cast<wstring>(StringFormatter (LangString["LINUX_ERROR_SIZE_HIDDEN_VOL"], limit, limit * 1024));
|
||||
|
||||
if (SectorSize < 4096)
|
||||
uint64 filesystemSize = GetSelectedVolumeFilesystemSize ();
|
||||
if (filesystemSize > TC_MAX_FAT_SECTOR_COUNT * (uint64) SectorSize)
|
||||
{
|
||||
err += LangString["LINUX_MAX_SIZE_HINT"];
|
||||
#if defined (TC_LINUX)
|
||||
err += LangString["LINUX_DOT_LF"];
|
||||
#else
|
||||
err += LangString["LINUX_NOT_SUPPORTED"];
|
||||
#endif
|
||||
Gui->ShowError (LangString["FAT_NOT_AVAILABLE_FOR_SO_LARGE_VOLUME"]);
|
||||
return GetCurrentStep();
|
||||
}
|
||||
|
||||
Gui->ShowError (err);
|
||||
return GetCurrentStep();
|
||||
}
|
||||
|
||||
if (SelectedVolumePath.IsDevice())
|
||||
|
||||
@@ -61,6 +61,7 @@ namespace VeraCrypt
|
||||
WizardStep ProcessPageChangeRequest (bool forward);
|
||||
void SetCreationProgressText (const wxString &text);
|
||||
|
||||
uint64 GetSelectedVolumeFilesystemSize () const;
|
||||
volatile bool AbortConfirmationPending;
|
||||
volatile bool AbortRequested;
|
||||
volatile bool CreationAborted;
|
||||
|
||||
@@ -937,9 +937,14 @@ namespace VeraCrypt
|
||||
ShowInfo (_("\nFilesystem:"));
|
||||
|
||||
vector <VolumeCreationOptions::FilesystemType::Enum> filesystems;
|
||||
bool fatAvailable = filesystemSize >= TC_MIN_FAT_FS_SIZE
|
||||
&& filesystemSize <= TC_MAX_FAT_SECTOR_COUNT * (uint64) options->SectorSize;
|
||||
|
||||
ShowInfo (wxString::Format (L" %li) %s", filesystems.size() + 1, LangString["NONE"])); filesystems.push_back (VolumeCreationOptions::FilesystemType::None);
|
||||
ShowInfo (wxString::Format (L" %li) %s", filesystems.size() + 1, "FAT")); filesystems.push_back (VolumeCreationOptions::FilesystemType::FAT);
|
||||
if (fatAvailable)
|
||||
{
|
||||
ShowInfo (wxString::Format (L" %li) %s", filesystems.size() + 1, "FAT")); filesystems.push_back (VolumeCreationOptions::FilesystemType::FAT);
|
||||
}
|
||||
#if defined (TC_LINUX)
|
||||
ShowInfo (wxString::Format (L" %li) %s", filesystems.size() + 1, "Linux Ext2")); filesystems.push_back (VolumeCreationOptions::FilesystemType::Ext2);
|
||||
ShowInfo (wxString::Format (L" %li) %s", filesystems.size() + 1, "Linux Ext3")); filesystems.push_back (VolumeCreationOptions::FilesystemType::Ext3);
|
||||
@@ -968,7 +973,21 @@ namespace VeraCrypt
|
||||
ShowInfo (wxString::Format (L" %li) %s", filesystems.size() + 1, "UFS")); filesystems.push_back (VolumeCreationOptions::FilesystemType::UFS);
|
||||
#endif
|
||||
|
||||
options->Filesystem = filesystems[AskSelection (filesystems.size(), 2) - 1];
|
||||
ssize_t defaultFilesystem = fatAvailable ? 2 : 1;
|
||||
if (!fatAvailable)
|
||||
{
|
||||
VolumeCreationOptions::FilesystemType::Enum nativeFilesystem = VolumeCreationOptions::FilesystemType::GetPlatformNative();
|
||||
for (size_t i = 0; i < filesystems.size(); ++i)
|
||||
{
|
||||
if (filesystems[i] == nativeFilesystem)
|
||||
{
|
||||
defaultFilesystem = (ssize_t) i + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
options->Filesystem = filesystems[AskSelection (filesystems.size(), defaultFilesystem) - 1];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user