@@ -170,13 +170,12 @@ class RootSignature {
170170 uint32_t StaticSamplersOffset;
171171 uint32_t Flags;
172172 ViewArray<dxbc::RootParameterHeader> ParametersHeaders;
173- uint32_t ParameterSpaceOffset;
174- StringRef ParameterSpace;
173+ StringRef PartData;
175174
176175 using param_header_iterator = ViewArray<dxbc::RootParameterHeader>::iterator;
177176
178177public:
179- RootSignature () {}
178+ RootSignature (StringRef PD) : PartData(PD ) {}
180179
181180 Error parse (StringRef Data);
182181 uint32_t getVersion () const { return Version; }
@@ -191,23 +190,22 @@ class RootSignature {
191190
192191 llvm::Expected<RootParameterView>
193192 getParameter (const dxbc::RootParameterHeader &Header) const {
194- assert (ParameterSpaceOffset != 0 &&
195- " This should be initialized before reading parameters" );
196- size_t CorrectOffset = Header.ParameterOffset - ParameterSpaceOffset;
197- StringRef Data;
198193 size_t DataSize;
199194
200195 switch (Header.ParameterType ) {
201196 case dxbc::RootParameterType::Constants32Bit:
202197 DataSize = sizeof (dxbc::RootConstants);
203198 break ;
204199 }
200+ auto EndOfSectionByte = getNumStaticSamplers () == 0
201+ ? PartData.size ()
202+ : getStaticSamplersOffset ();
205203
206- if (CorrectOffset + DataSize > ParameterSpace. size () )
204+ if (Header. ParameterOffset + DataSize > EndOfSectionByte )
207205 return parseFailed (" Reading structure out of file bounds" );
208206
209- Data = ParameterSpace .substr (CorrectOffset , DataSize);
210- RootParameterView View = RootParameterView (Header, Data );
207+ StringRef Buff = PartData .substr (Header. ParameterOffset , DataSize);
208+ RootParameterView View = RootParameterView (Header, Buff );
211209 return View;
212210 }
213211};
0 commit comments