@@ -82,21 +82,49 @@ void EncodeDecodeAndCompare(
8282 auto TPBuffer = Buffer + CxPlatTlsTPHeaderSize;
8383 uint16_t TPBufferLength = (uint16_t )(BufferLength - CxPlatTlsTPHeaderSize);
8484
85- QUIC_TRANSPORT_PARAMETERS Decoded;
85+ QUIC_TRANSPORT_PARAMETERS Decoded = {0 };
86+ TransportParametersScope TPScope (&Decoded);
8687 BOOLEAN DecodedSuccessfully =
8788 QuicCryptoTlsDecodeTransportParameters (
8889 &JunkConnection, IsServer, TPBuffer, TPBufferLength, &Decoded);
8990
9091 CXPLAT_FREE (Buffer, QUIC_POOL_TLS_TRANSPARAMS );
91- TransportParametersScope TPScope (&Decoded);
92-
9392 ASSERT_EQ (ShouldDecodeSuccessfully, DecodedSuccessfully);
94-
9593 if (ShouldDecodeSuccessfully) {
9694 CompareTransportParams (Original, &Decoded, IsServer);
9795 }
9896}
9997
98+ void DecodeTwice (
99+ _In_ const QUIC_TRANSPORT_PARAMETERS * Original,
100+ _In_ bool IsServer = false
101+ )
102+ {
103+ uint32_t BufferLength;
104+ auto Buffer =
105+ QuicCryptoTlsEncodeTransportParameters (
106+ &JunkConnection, IsServer, Original, NULL , &BufferLength);
107+ ASSERT_NE (nullptr , Buffer);
108+
109+ ASSERT_TRUE (UINT16_MAX >= (BufferLength - CxPlatTlsTPHeaderSize));
110+
111+ auto TPBuffer = Buffer + CxPlatTlsTPHeaderSize;
112+ uint16_t TPBufferLength = (uint16_t )(BufferLength - CxPlatTlsTPHeaderSize);
113+
114+ QUIC_TRANSPORT_PARAMETERS Decoded = {0 };
115+ TransportParametersScope TPScope (&Decoded);
116+ BOOLEAN DecodedSuccessfullyOnce =
117+ QuicCryptoTlsDecodeTransportParameters (
118+ &JunkConnection, IsServer, TPBuffer, TPBufferLength, &Decoded);
119+ BOOLEAN DecodedSuccessfullyTwice =
120+ QuicCryptoTlsDecodeTransportParameters (
121+ &JunkConnection, IsServer, TPBuffer, TPBufferLength, &Decoded);
122+
123+ CXPLAT_FREE (Buffer, QUIC_POOL_TLS_TRANSPARAMS );
124+ ASSERT_TRUE (DecodedSuccessfullyOnce);
125+ ASSERT_TRUE (DecodedSuccessfullyTwice);
126+ }
127+
100128/* TEST(TransportParamTest, EmptyClient)
101129{
102130 QUIC_TRANSPORT_PARAMETERS Original;
@@ -120,6 +148,15 @@ TEST(TransportParamTest, Preset1)
120148 EncodeDecodeAndCompare (&Original);
121149}
122150
151+ TEST (TransportParamTest, Preset1DecodeTwice)
152+ {
153+ QUIC_TRANSPORT_PARAMETERS Original;
154+ CxPlatZeroMemory (&Original, sizeof (Original));
155+ Original.Flags |= QUIC_TP_FLAG_IDLE_TIMEOUT ;
156+ Original.IdleTimeout = 100000 ;
157+ DecodeTwice (&Original);
158+ }
159+
123160TEST (TransportParamTest, ZeroTP)
124161{
125162 QUIC_TRANSPORT_PARAMETERS OriginalTP;
@@ -149,6 +186,18 @@ TEST(TransportParamTest, VersionNegotiationExtension)
149186 EncodeDecodeAndCompare (&OriginalTP);
150187}
151188
189+ TEST (TransportParamTest, VersionNegotiationExtensionDecodeTwice)
190+ {
191+ QUIC_TRANSPORT_PARAMETERS OriginalTP;
192+ CxPlatZeroMemory (&OriginalTP, sizeof (OriginalTP));
193+ uint8_t VerInfo[21 ];
194+ OriginalTP.VersionInfo = VerInfo;
195+ OriginalTP.VersionInfoLength = sizeof (VerInfo);
196+ OriginalTP.Flags = QUIC_TP_FLAG_VERSION_NEGOTIATION ;
197+
198+ DecodeTwice (&OriginalTP);
199+ }
200+
152201TEST (TransportParamTest, CibirEncodingOne)
153202{
154203 QUIC_TRANSPORT_PARAMETERS OriginalTP;
0 commit comments