@@ -445,12 +445,13 @@ SECURITY_STATUS ma_schannel_handshake_loop(MARIADB_PVIO *pvio, my_bool InitialRe
445
445
{
446
446
if (fDoRead )
447
447
{
448
- cbData = ( DWORD ) pvio -> methods -> read (pvio , IoBuffer + cbIoBuffer , (size_t )(SC_IO_BUFFER_SIZE - cbIoBuffer ));
449
- if (cbData == SOCKET_ERROR || cbData = = 0 )
448
+ ssize_t nbytes = pvio -> methods -> read (pvio , IoBuffer + cbIoBuffer , (size_t )(SC_IO_BUFFER_SIZE - cbIoBuffer ));
449
+ if (nbytes < = 0 )
450
450
{
451
451
rc = SEC_E_INTERNAL_ERROR ;
452
452
break ;
453
453
}
454
+ cbData = (DWORD )nbytes ;
454
455
cbIoBuffer += cbData ;
455
456
}
456
457
else
@@ -504,14 +505,14 @@ SECURITY_STATUS ma_schannel_handshake_loop(MARIADB_PVIO *pvio, my_bool InitialRe
504
505
{
505
506
if (OutBuffers .cbBuffer && OutBuffers .pvBuffer )
506
507
{
507
- cbData = ( DWORD ) pvio -> methods -> write (pvio , (uchar * )OutBuffers .pvBuffer , (size_t )OutBuffers .cbBuffer );
508
- if (cbData == SOCKET_ERROR || cbData = = 0 )
508
+ ssize_t nbytes = pvio -> methods -> write (pvio , (uchar * )OutBuffers .pvBuffer , (size_t )OutBuffers .cbBuffer );
509
+ if (nbytes < = 0 )
509
510
{
510
511
FreeContextBuffer (OutBuffers .pvBuffer );
511
512
DeleteSecurityContext (& sctx -> ctxt );
512
513
return SEC_E_INTERNAL_ERROR ;
513
514
}
514
-
515
+ cbData = ( DWORD ) nbytes ;
515
516
/* Free output context buffer */
516
517
FreeContextBuffer (OutBuffers .pvBuffer );
517
518
OutBuffers .pvBuffer = NULL ;
@@ -648,12 +649,13 @@ SECURITY_STATUS ma_schannel_client_handshake(MARIADB_TLS *ctls)
648
649
/* send client hello packaet */
649
650
if (BuffersOut .cbBuffer != 0 && BuffersOut .pvBuffer != NULL )
650
651
{
651
- r = (DWORD )pvio -> methods -> write (pvio , (uchar * )BuffersOut .pvBuffer , (size_t )BuffersOut .cbBuffer );
652
- if (r <= 0 )
652
+ ssize_t nbytes = (DWORD )pvio -> methods -> write (pvio , (uchar * )BuffersOut .pvBuffer , (size_t )BuffersOut .cbBuffer );
653
+ if (nbytes <= 0 )
653
654
{
654
655
sRet = SEC_E_INTERNAL_ERROR ;
655
656
goto end ;
656
657
}
658
+ r = (DWORD )nbytes ;
657
659
}
658
660
sRet = ma_schannel_handshake_loop (pvio , TRUE, & ExtraData );
659
661
@@ -708,7 +710,7 @@ SECURITY_STATUS ma_schannel_read_decrypt(MARIADB_PVIO *pvio,
708
710
uchar * ReadBuffer ,
709
711
DWORD ReadBufferSize )
710
712
{
711
- DWORD dwBytesRead = 0 ;
713
+ ssize_t nbytes = 0 ;
712
714
DWORD dwOffset = 0 ;
713
715
SC_CTX * sctx ;
714
716
SECURITY_STATUS sRet = 0 ;
@@ -725,22 +727,22 @@ SECURITY_STATUS ma_schannel_read_decrypt(MARIADB_PVIO *pvio,
725
727
726
728
while (1 )
727
729
{
728
- if (! dwBytesRead || sRet == SEC_E_INCOMPLETE_MESSAGE )
730
+ if (nbytes > 0 || sRet == SEC_E_INCOMPLETE_MESSAGE )
729
731
{
730
- dwBytesRead = ( DWORD ) pvio -> methods -> read (pvio , sctx -> IoBuffer + dwOffset , (size_t )(sctx -> IoBufferSize - dwOffset ));
731
- if (dwBytesRead == 0 )
732
+ nbytes = pvio -> methods -> read (pvio , sctx -> IoBuffer + dwOffset , (size_t )(sctx -> IoBufferSize - dwOffset ));
733
+ if (nbytes == 0 )
732
734
{
733
735
/* server closed connection */
734
736
// todo: error
735
737
return SEC_E_INVALID_HANDLE ;
736
738
}
737
- if (dwBytesRead < 0 )
739
+ if (nbytes < 0 )
738
740
{
739
741
/* socket error */
740
742
// todo: error
741
743
return SEC_E_INVALID_HANDLE ;
742
744
}
743
- dwOffset += dwBytesRead ;
745
+ dwOffset += ( DWORD ) nbytes ;
744
746
}
745
747
ZeroMemory (Buffers , sizeof (SecBuffer ) * 4 );
746
748
Buffers [0 ].pvBuffer = sctx -> IoBuffer ;
@@ -779,6 +781,7 @@ SECURITY_STATUS ma_schannel_read_decrypt(MARIADB_PVIO *pvio,
779
781
780
782
if (pData && pData -> cbBuffer )
781
783
{
784
+ assert (* DecryptLength + pData -> cbBuffer <= ReadBufferSize );
782
785
memcpy (ReadBuffer + * DecryptLength , pData -> pvBuffer , pData -> cbBuffer );
783
786
* DecryptLength += pData -> cbBuffer ;
784
787
return sRet ;
@@ -893,7 +896,7 @@ my_bool ma_schannel_verify_certs(SC_CTX *sctx)
893
896
SEC_E_OK on success
894
897
SEC_E_* if an error occured
895
898
*/
896
- size_t ma_schannel_write_encrypt (MARIADB_PVIO * pvio ,
899
+ ssize_t ma_schannel_write_encrypt (MARIADB_PVIO * pvio ,
897
900
uchar * WriteBuffer ,
898
901
size_t WriteBufferSize )
899
902
{
@@ -904,6 +907,7 @@ size_t ma_schannel_write_encrypt(MARIADB_PVIO *pvio,
904
907
PBYTE pbMessage ;
905
908
SC_CTX * sctx = (SC_CTX * )pvio -> ctls -> ssl ;
906
909
size_t payload ;
910
+ ssize_t nbytes ;
907
911
908
912
payload = MIN (WriteBufferSize , sctx -> IoBufferSize );
909
913
@@ -934,9 +938,8 @@ size_t ma_schannel_write_encrypt(MARIADB_PVIO *pvio,
934
938
if ((scRet = EncryptMessage (& sctx -> ctxt , 0 , & Message , 0 ))!= SEC_E_OK )
935
939
return -1 ;
936
940
937
- if (pvio -> methods -> write (pvio , sctx -> IoBuffer , Buffers [0 ].cbBuffer + Buffers [1 ].cbBuffer + Buffers [2 ].cbBuffer ))
938
- return payload ;
939
- return 0 ;
941
+ nbytes = pvio -> methods -> write (pvio , sctx -> IoBuffer , Buffers [0 ].cbBuffer + Buffers [1 ].cbBuffer + Buffers [2 ].cbBuffer );
942
+ return nbytes ;
940
943
}
941
944
/* }}} */
942
945
0 commit comments