@@ -968,14 +968,18 @@ void RemapShaderResources(const DXBCUtils::TResourceBindingMap& ResourceMap, con
968968struct ShaderBytecodeRemapper
969969{
970970public:
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
977981private:
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