Commit e97cbfb0 authored by Mark Mentovai's avatar Mark Mentovai Committed by Commit Bot

Remove variable-length arrays in the macOS disk image sniffer

This enables compiling this code with -Wvla.

safe_browsing::DiskImageTypeSnifferMac::AppleDiskImageTrailerSize was a
non-constexpr function whose implementation was hidden in
disk_image_type_sniffer_mac.cc, preventing its return value, no matter
how constant it actually was, from being used to size arrays statically
at compile time in other translation units, such as
archive_analyzer_results.cc. This changes it to be a constexpr variable,
kAppleDiskImageTrailerSize, which can be used to size arrays statically
at compile time.

Change-Id: I35d4582ce8446c9f90d8a6d8576c9d60115c5de8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2363069Reviewed-by: default avatarDaniel Rubery <drubery@chromium.org>
Commit-Queue: Mark Mentovai <mark@chromium.org>
Cr-Commit-Position: refs/heads/master@{#799215}
parent 443f08f1
...@@ -113,9 +113,9 @@ void UpdateArchiveAnalyzerResultsWithFile(base::FilePath path, ...@@ -113,9 +113,9 @@ void UpdateArchiveAnalyzerResultsWithFile(base::FilePath path,
uint32_t magic; uint32_t magic;
file->Read(0, reinterpret_cast<char*>(&magic), sizeof(uint32_t)); file->Read(0, reinterpret_cast<char*>(&magic), sizeof(uint32_t));
char dmg_header[DiskImageTypeSnifferMac::AppleDiskImageTrailerSize()]; char dmg_header[DiskImageTypeSnifferMac::kAppleDiskImageTrailerSize];
file->Read(0, dmg_header, file->Read(0, dmg_header,
DiskImageTypeSnifferMac::AppleDiskImageTrailerSize()); DiskImageTypeSnifferMac::kAppleDiskImageTrailerSize);
current_entry_is_executable = current_entry_is_executable =
FileTypePolicies::GetInstance()->IsCheckedBinaryFile(path) || FileTypePolicies::GetInstance()->IsCheckedBinaryFile(path) ||
...@@ -123,20 +123,20 @@ void UpdateArchiveAnalyzerResultsWithFile(base::FilePath path, ...@@ -123,20 +123,20 @@ void UpdateArchiveAnalyzerResultsWithFile(base::FilePath path,
DiskImageTypeSnifferMac::IsAppleDiskImageTrailer( DiskImageTypeSnifferMac::IsAppleDiskImageTrailer(
base::span<const uint8_t>( base::span<const uint8_t>(
reinterpret_cast<const uint8_t*>(dmg_header), reinterpret_cast<const uint8_t*>(dmg_header),
DiskImageTypeSnifferMac::AppleDiskImageTrailerSize())); DiskImageTypeSnifferMac::kAppleDiskImageTrailerSize));
// We can skip checking the trailer if we already know the file is executable. // We can skip checking the trailer if we already know the file is executable.
if (!current_entry_is_executable) { if (!current_entry_is_executable) {
char trailer[DiskImageTypeSnifferMac::AppleDiskImageTrailerSize()]; char trailer[DiskImageTypeSnifferMac::kAppleDiskImageTrailerSize];
file->Seek(base::File::Whence::FROM_END, file->Seek(base::File::Whence::FROM_END,
DiskImageTypeSnifferMac::AppleDiskImageTrailerSize()); DiskImageTypeSnifferMac::kAppleDiskImageTrailerSize);
file->ReadAtCurrentPos( file->ReadAtCurrentPos(trailer,
trailer, DiskImageTypeSnifferMac::AppleDiskImageTrailerSize()); DiskImageTypeSnifferMac::kAppleDiskImageTrailerSize);
current_entry_is_executable = current_entry_is_executable =
DiskImageTypeSnifferMac::IsAppleDiskImageTrailer( DiskImageTypeSnifferMac::IsAppleDiskImageTrailer(
base::span<const uint8_t>( base::span<const uint8_t>(
reinterpret_cast<const uint8_t*>(trailer), reinterpret_cast<const uint8_t*>(trailer),
DiskImageTypeSnifferMac::AppleDiskImageTrailerSize())); DiskImageTypeSnifferMac::kAppleDiskImageTrailerSize));
} }
#else #else
......
...@@ -11,7 +11,6 @@ namespace { ...@@ -11,7 +11,6 @@ namespace {
const uint8_t kKolySignature[4] = {'k', 'o', 'l', 'y'}; const uint8_t kKolySignature[4] = {'k', 'o', 'l', 'y'};
constexpr size_t kSizeKolySignatureInBytes = sizeof(kKolySignature); constexpr size_t kSizeKolySignatureInBytes = sizeof(kKolySignature);
const size_t kSizeKolyTrailerInBytes = 512;
} // namespace } // namespace
...@@ -30,7 +29,7 @@ bool DiskImageTypeSnifferMac::IsAppleDiskImage(const base::FilePath& dmg_file) { ...@@ -30,7 +29,7 @@ bool DiskImageTypeSnifferMac::IsAppleDiskImage(const base::FilePath& dmg_file) {
char data[kSizeKolySignatureInBytes]; char data[kSizeKolySignatureInBytes];
if (file.Seek(base::File::FROM_END, -1 * kSizeKolyTrailerInBytes) == -1) if (file.Seek(base::File::FROM_END, -1 * kAppleDiskImageTrailerSize) == -1)
return false; return false;
if (file.ReadAtCurrentPos(data, kSizeKolySignatureInBytes) != if (file.ReadAtCurrentPos(data, kSizeKolySignatureInBytes) !=
...@@ -54,11 +53,8 @@ bool DiskImageTypeSnifferMac::IsAppleDiskImageTrailer( ...@@ -54,11 +53,8 @@ bool DiskImageTypeSnifferMac::IsAppleDiskImageTrailer(
0); 0);
} }
// static
size_t DiskImageTypeSnifferMac::AppleDiskImageTrailerSize() {
return kSizeKolyTrailerInBytes;
}
DiskImageTypeSnifferMac::~DiskImageTypeSnifferMac() = default; DiskImageTypeSnifferMac::~DiskImageTypeSnifferMac() = default;
constexpr size_t DiskImageTypeSnifferMac::kAppleDiskImageTrailerSize;
} // namespace safe_browsing } // namespace safe_browsing
...@@ -27,8 +27,8 @@ class DiskImageTypeSnifferMac ...@@ -27,8 +27,8 @@ class DiskImageTypeSnifferMac
// Returns true when the trailer is a valid trailer for a DMG type. // Returns true when the trailer is a valid trailer for a DMG type.
static bool IsAppleDiskImageTrailer(const base::span<const uint8_t>& trailer); static bool IsAppleDiskImageTrailer(const base::span<const uint8_t>& trailer);
// Returns the size of a DMG trailer. // The size of a DMG trailer.
static size_t AppleDiskImageTrailerSize(); static constexpr size_t kAppleDiskImageTrailerSize = 512;
private: private:
friend class base::RefCountedThreadSafe<DiskImageTypeSnifferMac>; friend class base::RefCountedThreadSafe<DiskImageTypeSnifferMac>;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment