From bd8e6a70aae6b74712ee91814751d6478e548ef7 Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Wed, 14 Oct 2026 12:44:31 +0200 Subject: [PATCH] Unix: snapshot token import lengths before allocation Use a single file-length measurement for both the non-empty check and the vector allocation in GUI and text token imports. Reject lengths exceeding vector::max_size before converting to size_t, while retaining the cleanup guard before reading. --- src/Main/Forms/SecurityTokenKeyfilesDialog.cpp | 7 +++++-- src/Main/TextUserInterface.cpp | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/Main/Forms/SecurityTokenKeyfilesDialog.cpp b/src/Main/Forms/SecurityTokenKeyfilesDialog.cpp index c3bfd308..df86ed75 100644 --- a/src/Main/Forms/SecurityTokenKeyfilesDialog.cpp +++ b/src/Main/Forms/SecurityTokenKeyfilesDialog.cpp @@ -146,9 +146,12 @@ namespace VeraCrypt File keyfile; keyfile.Open (keyfilePath, File::OpenRead, File::ShareReadWrite, File::PreserveTimestamps); - if (keyfile.Length() > 0) + const uint64 keyfileSize = keyfile.Length(); + if (keyfileSize > 0) { - vector keyfileData (keyfile.Length()); + if (keyfileSize > vector ().max_size()) + throw ParameterTooLarge (SRC_POS, keyfilePath); + vector keyfileData (static_cast (keyfileSize)); finally_do_arg ( vector *, &keyfileData, { if (!finally_arg->empty()) burn (&finally_arg->front(), finally_arg->size()); } diff --git a/src/Main/TextUserInterface.cpp b/src/Main/TextUserInterface.cpp index 62eeda36..30705790 100644 --- a/src/Main/TextUserInterface.cpp +++ b/src/Main/TextUserInterface.cpp @@ -1357,9 +1357,12 @@ namespace VeraCrypt File keyfile; keyfile.Open (keyfilePath, File::OpenRead, File::ShareReadWrite, File::PreserveTimestamps); - if (keyfile.Length() > 0) + const uint64 keyfileSize = keyfile.Length(); + if (keyfileSize > 0) { - vector keyfileData (keyfile.Length()); + if (keyfileSize > vector ().max_size()) + throw ParameterTooLarge (SRC_POS, FilePath (keyfilePath)); + vector keyfileData (static_cast (keyfileSize)); finally_do_arg ( vector *, &keyfileData, { if (!finally_arg->empty()) burn (&finally_arg->front(), finally_arg->size()); }