Hash :
25390156
Author :
Date :
2025-08-21T00:13:19
Suppress unsafe buffers on a file-by-file basis in src/ [1 of N] In this CL, we suppress many files but stop short of actually enabling the warning by not removing the line from the unsafe_buffers_paths.txt file. That will happen in a follow-on CL, along with resolving any stragglers missed here. This is mostly a manual change so as to familiarize myself with the kinds of issues faced by the Angle codebase when applying buffer safety warnings. -- Re-generate affected hashes. -- Clang-format applied to all changed files. -- Add a few missing .reserve() calls to vectors as noticed. -- Fix some mismatches between file names and header comments. -- Be more consistent with header comment format (blank lines and trailing //-only lines when a filename comment adjoins license boilerplate). Bug: b/436880895 Change-Id: I3bde5cc2059acbe8345057289214f1a26f1c34aa Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6869022 Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
//
// Copyright 2024 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Decompress_unittest.cpp: Unit tests for the |(Compress/Decompress)*Blob| functions.
#ifdef UNSAFE_BUFFERS_BUILD
# pragma allow_unsafe_buffers
#endif
#include <gtest/gtest.h>
#include "libANGLE/angletypes.h"
namespace angle
{
namespace
{
class DecompressTest : public ::testing::Test
{
protected:
void SetUp() override
{
constexpr size_t kTestDataSize = 100'000;
mTestData.resize(kTestDataSize);
for (size_t i = 0; i < kTestDataSize; ++i)
{
mTestData[i] = static_cast<uint8_t>(i);
}
ASSERT_TRUE(CompressBlob(mTestData.size(), mTestData.data(), &mCompressedData));
}
void setCompressedDataLastDWord(uint32_t value)
{
ASSERT(IsLittleEndian());
ASSERT(mCompressedData.size() > sizeof(value));
memcpy(mCompressedData.data() + mCompressedData.size() - sizeof(value), &value,
sizeof(value));
}
bool decompress(size_t compressedSize, size_t maxUncompressedDataSize)
{
return DecompressBlob(mCompressedData.data(), compressedSize, maxUncompressedDataSize,
&mUncompressedData);
}
bool checkUncompressedData()
{
return (mTestData.size() == mUncompressedData.size()) &&
(memcmp(mTestData.data(), mUncompressedData.data(), mTestData.size()) == 0);
}
std::vector<uint8_t> mTestData;
MemoryBuffer mCompressedData;
MemoryBuffer mUncompressedData;
};
// Tests that decompressing full data has no errors.
TEST_F(DecompressTest, FullData)
{
EXPECT_TRUE(decompress(mCompressedData.size(), mTestData.size()));
EXPECT_TRUE(checkUncompressedData());
}
// Tests expected failure if |maxUncompressedDataSize| is less than actual uncompressed size.
TEST_F(DecompressTest, InsufficientMaxUncompressedDataSize)
{
EXPECT_FALSE(decompress(mCompressedData.size(), mTestData.size() - 1));
}
// Tests expected failure if try to decompress partial compressed data.
TEST_F(DecompressTest, UnexpectedPartialData)
{
// Use this to avoid |maxUncompressedDataSize| affecting the test.
constexpr size_t kMaxUncompressedDataSize = std::numeric_limits<size_t>::max();
EXPECT_FALSE(decompress(mCompressedData.size() - 1, kMaxUncompressedDataSize));
}
// Tests expected failure if try to decompress corrupted data.
TEST_F(DecompressTest, CorruptedData)
{
// Corrupt the compressed data.
const size_t corruptIndex = mCompressedData.size() / 2;
mCompressedData[corruptIndex] ^= 255;
EXPECT_FALSE(decompress(mCompressedData.size(), mTestData.size()));
}
// Tests expected failures if try to decompress data with the corrupted last dword.
TEST_F(DecompressTest, CorruptedLastDWord)
{
// Last dword stores decompressed data size and not the actual compressed data. This dword must
// match the decompressed size. Decompress should fail if it is not the case.
// Use this to avoid |maxUncompressedDataSize| affecting the test.
constexpr size_t kMaxUncompressedDataSize = std::numeric_limits<size_t>::max();
// Try to decompress with decreased size in the last dword.
setCompressedDataLastDWord(static_cast<uint32_t>(mTestData.size() - 1));
EXPECT_FALSE(decompress(mCompressedData.size(), kMaxUncompressedDataSize));
// Try to decompress with increased size in the last dword.
setCompressedDataLastDWord(static_cast<uint32_t>(mTestData.size() + 1));
EXPECT_FALSE(decompress(mCompressedData.size(), kMaxUncompressedDataSize));
// Try to decompress with the last dword set to 0.
setCompressedDataLastDWord(0);
EXPECT_FALSE(decompress(mCompressedData.size(), kMaxUncompressedDataSize));
// Decompress with the last dword set to the correct size should succeed.
setCompressedDataLastDWord(static_cast<uint32_t>(mTestData.size()));
EXPECT_TRUE(decompress(mCompressedData.size(), kMaxUncompressedDataSize));
EXPECT_TRUE(checkUncompressedData());
}
} // anonymous namespace
} // namespace angle