@@ -100,6 +100,13 @@ SECURITY_STATUS ma_schannel_handshake_loop(MARIADB_PVIO *pvio, my_bool InitialRe
100
100
return SEC_E_INSUFFICIENT_MEMORY ;
101
101
102
102
cbIoBuffer = 0 ;
103
+
104
+ if (!InitialRead && pExtraData -> cbBuffer )
105
+ {
106
+ memcpy (IoBuffer , pExtraData -> pvBuffer ,pExtraData -> cbBuffer );
107
+ cbIoBuffer = pExtraData -> cbBuffer ;
108
+ }
109
+
103
110
fDoRead = InitialRead ;
104
111
105
112
/* handshake loop: We will leave if handshake is finished
@@ -445,7 +452,7 @@ SECURITY_STATUS ma_schannel_read_decrypt(MARIADB_PVIO *pvio,
445
452
} while (sRet == SEC_E_INCOMPLETE_MESSAGE ); /* Continue reading until full message arrives */
446
453
447
454
448
- if (sRet != SEC_E_OK )
455
+ if (sRet != SEC_E_OK && sRet != SEC_I_RENEGOTIATE )
449
456
{
450
457
ma_schannel_set_sec_error (pvio , sRet );
451
458
return sRet ;
@@ -462,20 +469,21 @@ SECURITY_STATUS ma_schannel_read_decrypt(MARIADB_PVIO *pvio,
462
469
}
463
470
464
471
465
- if (sctx -> dataBuf .cbBuffer )
472
+ if (sctx -> dataBuf .cbBuffer || sRet == SEC_I_RENEGOTIATE )
466
473
{
467
474
assert (sctx -> dataBuf .pvBuffer );
468
475
/*
469
476
Copy at most ReadBufferSize bytes to output.
470
477
Store the rest (if any) to be processed next time.
471
478
*/
472
479
nbytes = MIN (sctx -> dataBuf .cbBuffer , ReadBufferSize );
473
- memcpy ((char * )ReadBuffer , sctx -> dataBuf .pvBuffer , nbytes );
480
+ if (nbytes )
481
+ memcpy ((char * )ReadBuffer , sctx -> dataBuf .pvBuffer , nbytes );
474
482
sctx -> dataBuf .cbBuffer -= (unsigned long )nbytes ;
475
483
sctx -> dataBuf .pvBuffer = (char * )sctx -> dataBuf .pvBuffer + nbytes ;
476
484
477
485
* DecryptLength = (DWORD )nbytes ;
478
- return SEC_E_OK ;
486
+ return sRet ;
479
487
}
480
488
// No data buffer, loop
481
489
}
0 commit comments