mirror of
https://github.com/KhronosGroup/SPIRV-Tools
synced 2024-10-18 11:10:05 +00:00
Validate SPIRV Version number when parsing binary header (#3834)
Fixes #3831
This commit is contained in:
parent
67525bded1
commit
d1bb98fd48
@ -45,6 +45,14 @@ spv_result_t spvBinaryHeaderGet(const spv_const_binary binary,
|
|||||||
// TODO: Validation checking?
|
// TODO: Validation checking?
|
||||||
pHeader->magic = spvFixWord(binary->code[SPV_INDEX_MAGIC_NUMBER], endian);
|
pHeader->magic = spvFixWord(binary->code[SPV_INDEX_MAGIC_NUMBER], endian);
|
||||||
pHeader->version = spvFixWord(binary->code[SPV_INDEX_VERSION_NUMBER], endian);
|
pHeader->version = spvFixWord(binary->code[SPV_INDEX_VERSION_NUMBER], endian);
|
||||||
|
// Per 2.3.1 version's high and low bytes are 0
|
||||||
|
if ((pHeader->version & 0x000000ff) || pHeader->version & 0xff000000)
|
||||||
|
return SPV_ERROR_INVALID_BINARY;
|
||||||
|
// Minimum version was 1.0 and max version is defined by SPV_VERSION.
|
||||||
|
if (pHeader->version < SPV_SPIRV_VERSION_WORD(1, 0) ||
|
||||||
|
pHeader->version > SPV_VERSION)
|
||||||
|
return SPV_ERROR_INVALID_BINARY;
|
||||||
|
|
||||||
pHeader->generator =
|
pHeader->generator =
|
||||||
spvFixWord(binary->code[SPV_INDEX_GENERATOR_NUMBER], endian);
|
spvFixWord(binary->code[SPV_INDEX_GENERATOR_NUMBER], endian);
|
||||||
pHeader->bound = spvFixWord(binary->code[SPV_INDEX_BOUND], endian);
|
pHeader->bound = spvFixWord(binary->code[SPV_INDEX_BOUND], endian);
|
||||||
|
@ -81,5 +81,37 @@ TEST_F(BinaryHeaderGet, TruncatedHeader) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(BinaryHeaderGet, VersionNonZeroHighByte) {
|
||||||
|
spv_header_t header;
|
||||||
|
code[1] = 0xFF010300;
|
||||||
|
spv_const_binary_t const_bin = get_const_binary();
|
||||||
|
ASSERT_EQ(SPV_ERROR_INVALID_BINARY,
|
||||||
|
spvBinaryHeaderGet(&const_bin, SPV_ENDIANNESS_LITTLE, &header));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(BinaryHeaderGet, VersionNonZeroLowByte) {
|
||||||
|
spv_header_t header;
|
||||||
|
code[1] = 0x000103F0;
|
||||||
|
spv_const_binary_t const_bin = get_const_binary();
|
||||||
|
ASSERT_EQ(SPV_ERROR_INVALID_BINARY,
|
||||||
|
spvBinaryHeaderGet(&const_bin, SPV_ENDIANNESS_LITTLE, &header));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(BinaryHeaderGet, VersionTooLow) {
|
||||||
|
spv_header_t header;
|
||||||
|
code[1] = 0x00000300;
|
||||||
|
spv_const_binary_t const_bin = get_const_binary();
|
||||||
|
ASSERT_EQ(SPV_ERROR_INVALID_BINARY,
|
||||||
|
spvBinaryHeaderGet(&const_bin, SPV_ENDIANNESS_LITTLE, &header));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(BinaryHeaderGet, VersionTooHigh) {
|
||||||
|
spv_header_t header;
|
||||||
|
code[1] = 0x000F0300;
|
||||||
|
spv_const_binary_t const_bin = get_const_binary();
|
||||||
|
ASSERT_EQ(SPV_ERROR_INVALID_BINARY,
|
||||||
|
spvBinaryHeaderGet(&const_bin, SPV_ENDIANNESS_LITTLE, &header));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace spvtools
|
} // namespace spvtools
|
||||||
|
@ -27,21 +27,21 @@ TEST_F(BinaryVersion, LinkerChoosesMaxSpirvVersion) {
|
|||||||
spvtest::Binaries binaries = {
|
spvtest::Binaries binaries = {
|
||||||
{
|
{
|
||||||
SpvMagicNumber,
|
SpvMagicNumber,
|
||||||
0x00000300u,
|
0x00010300u,
|
||||||
SPV_GENERATOR_CODEPLAY,
|
SPV_GENERATOR_CODEPLAY,
|
||||||
1u, // NOTE: Bound
|
1u, // NOTE: Bound
|
||||||
0u // NOTE: Schema; reserved
|
0u // NOTE: Schema; reserved
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
SpvMagicNumber,
|
SpvMagicNumber,
|
||||||
0x00000600u,
|
0x00010500u,
|
||||||
SPV_GENERATOR_CODEPLAY,
|
SPV_GENERATOR_CODEPLAY,
|
||||||
1u, // NOTE: Bound
|
1u, // NOTE: Bound
|
||||||
0u // NOTE: Schema; reserved
|
0u // NOTE: Schema; reserved
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
SpvMagicNumber,
|
SpvMagicNumber,
|
||||||
0x00000100u,
|
0x00010100u,
|
||||||
SPV_GENERATOR_CODEPLAY,
|
SPV_GENERATOR_CODEPLAY,
|
||||||
1u, // NOTE: Bound
|
1u, // NOTE: Bound
|
||||||
0u // NOTE: Schema; reserved
|
0u // NOTE: Schema; reserved
|
||||||
@ -53,7 +53,7 @@ TEST_F(BinaryVersion, LinkerChoosesMaxSpirvVersion) {
|
|||||||
ASSERT_EQ(SPV_SUCCESS, Link(binaries, &linked_binary));
|
ASSERT_EQ(SPV_SUCCESS, Link(binaries, &linked_binary));
|
||||||
EXPECT_THAT(GetErrorMessage(), std::string());
|
EXPECT_THAT(GetErrorMessage(), std::string());
|
||||||
|
|
||||||
EXPECT_EQ(0x00000600u, linked_binary[1]);
|
EXPECT_EQ(0x00010500u, linked_binary[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
Loading…
Reference in New Issue
Block a user