Skip to content

Commit 44b80f9

Browse files
DXBCUtils::RemapResourceBindings: use more accurate chunk end
1 parent 58d45cb commit 44b80f9

File tree

1 file changed

+21
-23
lines changed

1 file changed

+21
-23
lines changed

Graphics/ShaderTools/src/DXBCUtils.cpp

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -968,14 +968,18 @@ void RemapShaderResources(const DXBCUtils::TResourceBindingMap& ResourceMap, con
968968
struct ShaderBytecodeRemapper
969969
{
970970
public:
971-
ShaderBytecodeRemapper(ShaderChunkHeader const& _Header, TExtendedResourceMap& _ExtResMap, ResourceBindingPerType const& _BindingsPerType) :
972-
Header{_Header}, ExtResourceMap{_ExtResMap}, BindingsPerType{_BindingsPerType}
971+
ShaderBytecodeRemapper(ShaderChunkHeader& _Header,
972+
TExtendedResourceMap& _ExtResMap,
973+
ResourceBindingPerType const& _BindingsPerType) :
974+
Header{_Header},
975+
ExtResourceMap{_ExtResMap},
976+
BindingsPerType{_BindingsPerType}
973977
{}
974978

975-
void PatchBytecode(Uint32* Token, const void* EndPtr) noexcept(false);
979+
void PatchBytecode(const void* ChunkEnd) noexcept(false);
976980

977981
private:
978-
ShaderChunkHeader const& Header;
982+
ShaderChunkHeader& Header;
979983
TExtendedResourceMap& ExtResourceMap;
980984
ResourceBindingPerType const& BindingsPerType;
981985

@@ -1676,23 +1680,16 @@ void ShaderBytecodeRemapper::ParseOpcode(Uint32*& Token, const void* Finish)
16761680
}
16771681
}
16781682

1679-
void ShaderBytecodeRemapper::PatchBytecode(Uint32* Token, const void* EndPtr) noexcept(false)
1683+
void ShaderBytecodeRemapper::PatchBytecode(const void* ChunkEnd) noexcept(false)
16801684
{
1681-
VERIFY_EXPR(Token == static_cast<const void*>(&Header + 1));
1682-
const void* Finish = reinterpret_cast<const char*>(&Header) + sizeof(ChunkHeader) + Header.Length;
1683-
1685+
VERIFY_EXPR(ChunkEnd == reinterpret_cast<const Uint8*>(&Header) + sizeof(ChunkHeader) + Header.Length);
16841686
VERIFY_EXPR(Header.VersionMajor >= 4);
16851687
VERIFY_EXPR(Header.ProgramType < PROGRAM_TYPE_COUNT_SM5);
16861688
VERIFY_EXPR(Header.NumDWords * 4 == Header.Length);
16871689

1688-
if (Finish > EndPtr)
1690+
for (Uint32* Token = reinterpret_cast<Uint32*>(&Header + 1); Token < ChunkEnd;)
16891691
{
1690-
LOG_ERROR_AND_THROW("Shader code chunk is outside of the specified byte code range. The byte code may be corrupted.");
1691-
}
1692-
1693-
for (; Token < Finish;)
1694-
{
1695-
ParseOpcode(Token, Finish);
1692+
ParseOpcode(Token, ChunkEnd);
16961693
}
16971694
}
16981695

@@ -1775,24 +1772,27 @@ RefCntAutoPtr<IDataBlob> RemapResourceBindings(const TResourceBindingMap& Resour
17751772
}
17761773

17771774
ChunkHeader& Chunk = reinterpret_cast<ChunkHeader&>(RemappedBytecode[ChunkOffset]);
1778-
if (ChunkOffset + Chunk.Length > RemappedBytecode.size())
1775+
// The DXBC file format defines each chunk as starting with a fixed-size base header (ChunkHeader),
1776+
// and the Length field specifies the size of the data following that base header.
1777+
if (ChunkOffset + sizeof(ChunkHeader) + Chunk.Length > RemappedBytecode.size())
17791778
{
17801779
LOG_ERROR_MESSAGE("Not enough space for the chunk data. The byte code may be corrupted.");
17811780
return {};
17821781
}
1782+
const void* const ChunkEnd = reinterpret_cast<const Uint8*>(&Chunk + 1) + Chunk.Length;
17831783

17841784
if (Chunk.Magic == RDEFFourCC)
17851785
{
17861786
ResourceDefChunkHeader& RDEFHeader = reinterpret_cast<ResourceDefChunkHeader&>(Chunk);
17871787

17881788
if (RDEFHeader.MajorVersion == 5 && RDEFHeader.MinorVersion == 1)
17891789
{
1790-
RemapShaderResources<ResourceBindingInfo51>(ResourceMap, RemappedBytecode.data() + RemappedBytecode.size(), RDEFHeader, ExtResourceMap, BindingsPerType);
1790+
RemapShaderResources<ResourceBindingInfo51>(ResourceMap, ChunkEnd, RDEFHeader, ExtResourceMap, BindingsPerType);
17911791
RemapResDef = true;
17921792
}
17931793
else if ((RDEFHeader.MajorVersion == 5 && RDEFHeader.MinorVersion == 0) || RDEFHeader.MajorVersion < 5)
17941794
{
1795-
RemapShaderResources<ResourceBindingInfo50>(ResourceMap, RemappedBytecode.data() + RemappedBytecode.size(), RDEFHeader, ExtResourceMap, BindingsPerType);
1795+
RemapShaderResources<ResourceBindingInfo50>(ResourceMap, ChunkEnd, RDEFHeader, ExtResourceMap, BindingsPerType);
17961796
RemapResDef = true;
17971797
}
17981798
else
@@ -1803,11 +1803,9 @@ RefCntAutoPtr<IDataBlob> RemapResourceBindings(const TResourceBindingMap& Resour
18031803

18041804
if (Chunk.Magic == SHDRFourCC || Chunk.Magic == SHEXFourCC)
18051805
{
1806-
Uint32* Token = reinterpret_cast<Uint32*>(&RemappedBytecode[ChunkOffset + sizeof(ShaderChunkHeader)]);
1807-
const ShaderChunkHeader& SBHeader = reinterpret_cast<ShaderChunkHeader&>(Chunk);
1808-
ShaderBytecodeRemapper Remapper{SBHeader, ExtResourceMap, BindingsPerType};
1809-
1810-
Remapper.PatchBytecode(Token, RemappedBytecode.data() + RemappedBytecode.size());
1806+
ShaderChunkHeader& SBHeader = reinterpret_cast<ShaderChunkHeader&>(Chunk);
1807+
ShaderBytecodeRemapper Remapper{SBHeader, ExtResourceMap, BindingsPerType};
1808+
Remapper.PatchBytecode(ChunkEnd);
18111809
PatchOK = true;
18121810
}
18131811
}

0 commit comments

Comments
 (0)