@@ -822,6 +822,43 @@ TEST(DXCFile, MalformedSignature) {
822822 }
823823}
824824
825+ TEST (RootSignature, MalformedData) {
826+ {
827+ // RootParametersOffset is 255.
828+ uint8_t Buffer[] = {
829+ 0x44 , 0x58 , 0x42 , 0x43 , 0x32 , 0x9a , 0x53 , 0xd8 , 0xec , 0xbe , 0x35 , 0x6f ,
830+ 0x05 , 0x39 , 0xe1 , 0xfe , 0x31 , 0x20 , 0xf0 , 0xc1 , 0x01 , 0x00 , 0x00 , 0x00 ,
831+ 0x85 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x24 , 0x00 , 0x00 , 0x00 ,
832+ 0x52 , 0x54 , 0x53 , 0x30 , 0x59 , 0x00 , 0x00 , 0x00 , 0x02 , 0x00 , 0x00 , 0x00 ,
833+ 0x01 , 0x00 , 0x00 , 0x00 , 0xFF , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
834+ 0x2c , 0x00 , 0x00 , 0x00 , 0x11 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 ,
835+ 0x02 , 0x00 , 0x00 , 0x00 , 0x24 , 0x00 , 0x00 , 0x00 , 0x0f , 0x00 , 0x00 , 0x00 ,
836+ 0x0e , 0x00 , 0x00 , 0x00 , 0x10 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
837+ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
838+ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
839+ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
840+ 0x00 };
841+ DXContainer C =
842+ llvm::cantFail (DXContainer::create (getMemoryBuffer<133 >(Buffer)));
843+
844+ auto MaybeRS = C.getRootSignature ();
845+ ASSERT_TRUE (MaybeRS.has_value ());
846+ const auto &RS = MaybeRS.value ();
847+ ASSERT_EQ (RS.getVersion (), 2u );
848+ ASSERT_EQ (RS.getNumParameters (), 1u );
849+ ASSERT_EQ (RS.getRootParametersOffset (), 255u );
850+ ASSERT_EQ (RS.getNumStaticSamplers (), 0u );
851+ ASSERT_EQ (RS.getStaticSamplersOffset (), 44u );
852+ ASSERT_EQ (RS.getFlags (), 17u );
853+
854+ // Since the offset is wrong, the data becomes invalid.
855+ auto RootParam = *RS.param_headers ().begin ();
856+ auto ParamView = RS.getParameter (RootParam);
857+ ASSERT_THAT_ERROR (ParamView.takeError (),
858+ FailedWithMessage (" invalid parameter type" ));
859+ }
860+ }
861+
825862TEST (RootSignature, ParseRootFlags) {
826863 {
827864 uint8_t Buffer[] = {
@@ -844,7 +881,6 @@ TEST(RootSignature, ParseRootFlags) {
844881 ASSERT_EQ (RS->getStaticSamplersOffset (), 0u );
845882 ASSERT_EQ (RS->getFlags (), 0x01u );
846883 }
847-
848884 {
849885 // this parameter has the root signature definition missing some values.
850886 uint8_t Buffer[] = {
0 commit comments