@@ -2123,6 +2123,45 @@ CxPlatTlsWriteDataToSchannel(
21232123 }
21242124
21252125 switch (SecStatus ) {
2126+ case SEC_E_BUFFER_TOO_SMALL : {
2127+ //
2128+ // The output buffer for the TLS response is too small. We need to grow
2129+ // the buffer and try again.
2130+ //
2131+ QuicTraceLogConnInfo (
2132+ SchannelOutBufferTooSmall ,
2133+ TlsContext -> Connection ,
2134+ "Increasing TLS output buffer size" );
2135+ uint16_t NewBufferLength = State -> BufferAllocLength << 1 ;
2136+ if (NewBufferLength < State -> BufferAllocLength ) { // Integer overflow.
2137+ QuicTraceEvent (
2138+ TlsError ,
2139+ "[ tls][%p] ERROR, %s." ,
2140+ TlsContext -> Connection ,
2141+ "TLS buffer too large" );
2142+ Result |= CXPLAT_TLS_RESULT_ERROR ;
2143+ break ;
2144+ }
2145+ uint8_t * NewBuffer = CXPLAT_ALLOC_NONPAGED (NewBufferLength , QUIC_POOL_TLS_BUFFER );
2146+ if (NewBuffer == NULL ) {
2147+ QuicTraceEvent (
2148+ AllocFailure ,
2149+ "Allocation of '%s' failed. (%llu bytes)" ,
2150+ "New TLS RX Buffer" ,
2151+ NewBufferLength );
2152+ Result |= CXPLAT_TLS_RESULT_ERROR ;
2153+ break ;
2154+ }
2155+ if (State -> BufferLength ) {
2156+ CxPlatCopyMemory (NewBuffer , State -> Buffer , State -> BufferLength );
2157+ }
2158+ CXPLAT_FREE (State -> Buffer , QUIC_POOL_TLS_BUFFER );
2159+ State -> Buffer = NewBuffer ;
2160+ State -> BufferAllocLength = NewBufferLength ;
2161+ Result |= CXPLAT_TLS_RESULT_CONTINUE ;
2162+ break ;
2163+ }
2164+
21262165 case SEC_E_OK :
21272166
21282167 //
0 commit comments