Skip to content

Commit 629ec64

Browse files
committed
Fix PVIO to return number of bytes read/written as "signed" integer
since there is a lot of checks for return code being < 0 or -1.
1 parent 7cb8479 commit 629ec64

File tree

12 files changed

+84
-80
lines changed

12 files changed

+84
-80
lines changed

include/ma_global.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
#endif
3838

3939
#include <ma_config.h>
40-
40+
#include <assert.h>
4141
#ifndef __GNUC__
4242
#define __attribute(A)
4343
#endif

include/ma_pvio.h

+7-7
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,10 @@ struct st_ma_pvio_methods
9393
{
9494
my_bool (*set_timeout)(MARIADB_PVIO *pvio, enum enum_pvio_timeout type, int timeout);
9595
int (*get_timeout)(MARIADB_PVIO *pvio, enum enum_pvio_timeout type);
96-
size_t (*read)(MARIADB_PVIO *pvio, uchar *buffer, size_t length);
97-
size_t (*async_read)(MARIADB_PVIO *pvio, uchar *buffer, size_t length);
98-
size_t (*write)(MARIADB_PVIO *pvio, const uchar *buffer, size_t length);
99-
size_t (*async_write)(MARIADB_PVIO *pvio, const uchar *buffer, size_t length);
96+
ssize_t (*read)(MARIADB_PVIO *pvio, uchar *buffer, size_t length);
97+
ssize_t (*async_read)(MARIADB_PVIO *pvio, uchar *buffer, size_t length);
98+
ssize_t (*write)(MARIADB_PVIO *pvio, const uchar *buffer, size_t length);
99+
ssize_t (*async_write)(MARIADB_PVIO *pvio, const uchar *buffer, size_t length);
100100
int (*wait_io_or_timeout)(MARIADB_PVIO *pvio, my_bool is_read, int timeout);
101101
my_bool (*blocking)(MARIADB_PVIO *pvio, my_bool value, my_bool *old_value);
102102
my_bool (*connect)(MARIADB_PVIO *pvio, MA_PVIO_CINFO *cinfo);
@@ -113,9 +113,9 @@ struct st_ma_pvio_methods
113113
/* Function prototypes */
114114
MARIADB_PVIO *ma_pvio_init(MA_PVIO_CINFO *cinfo);
115115
void ma_pvio_close(MARIADB_PVIO *pvio);
116-
size_t ma_pvio_cache_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length);
117-
size_t ma_pvio_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length);
118-
size_t ma_pvio_write(MARIADB_PVIO *pvio, const uchar *buffer, size_t length);
116+
ssize_t ma_pvio_cache_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length);
117+
ssize_t ma_pvio_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length);
118+
ssize_t ma_pvio_write(MARIADB_PVIO *pvio, const uchar *buffer, size_t length);
119119
int ma_pvio_get_timeout(MARIADB_PVIO *pvio, enum enum_pvio_timeout type);
120120
my_bool ma_pvio_set_timeout(MARIADB_PVIO *pvio, enum enum_pvio_timeout type, int timeout);
121121
int ma_pvio_fast_send(MARIADB_PVIO *pvio);

include/ma_tls.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ my_bool ma_tls_connect(MARIADB_TLS *ctls);
7373
0-n bytes read
7474
-1 if an error occured
7575
*/
76-
size_t ma_tls_read(MARIADB_TLS *ctls, const uchar* buffer, size_t length);
76+
ssize_t ma_tls_read(MARIADB_TLS *ctls, const uchar* buffer, size_t length);
7777

7878
/* ma_tls_write
7979
write buffer to socket
@@ -85,7 +85,7 @@ size_t ma_tls_read(MARIADB_TLS *ctls, const uchar* buffer, size_t length);
8585
0-n bytes written
8686
-1 if an error occured
8787
*/
88-
size_t ma_tls_write(MARIADB_TLS *ctls, const uchar* buffer, size_t length);
88+
ssize_t ma_tls_write(MARIADB_TLS *ctls, const uchar* buffer, size_t length);
8989

9090
/* ma_tls_close
9191
closes SSL connection and frees SSL structure which was previously
@@ -143,8 +143,8 @@ my_bool ma_tls_get_protocol_version(MARIADB_TLS *ctls, struct st_ssl_version *ve
143143
/* Function prototypes */
144144
MARIADB_TLS *ma_pvio_tls_init(MYSQL *mysql);
145145
my_bool ma_pvio_tls_connect(MARIADB_TLS *ctls);
146-
size_t ma_pvio_tls_read(MARIADB_TLS *ctls, const uchar *buffer, size_t length);
147-
size_t ma_pvio_tls_write(MARIADB_TLS *ctls, const uchar *buffer, size_t length);
146+
ssize_t ma_pvio_tls_read(MARIADB_TLS *ctls, const uchar *buffer, size_t length);
147+
ssize_t ma_pvio_tls_write(MARIADB_TLS *ctls, const uchar *buffer, size_t length);
148148
my_bool ma_pvio_tls_close(MARIADB_TLS *ctls);
149149
int ma_pvio_tls_verify_server_cert(MARIADB_TLS *ctls);
150150
const char *ma_pvio_tls_cipher(MARIADB_TLS *ctls);

libmariadb/ma_net.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ int net_add_multi_command(NET *net, uchar command, const uchar *packet,
362362
int
363363
ma_net_real_write(NET *net,const char *packet,size_t len)
364364
{
365-
size_t length;
365+
ssize_t length;
366366
char *pos,*end;
367367

368368
if (net->error == 2)
@@ -399,7 +399,7 @@ ma_net_real_write(NET *net,const char *packet,size_t len)
399399
pos=(char*) packet; end=pos+len;
400400
while (pos != end)
401401
{
402-
if ((ssize_t) (length=ma_pvio_write(net->pvio,(uchar *)pos,(size_t) (end-pos))) <= 0)
402+
if ((length=ma_pvio_write(net->pvio,(uchar *)pos,(size_t) (end-pos))) <= 0)
403403
{
404404
net->error=2; /* Close socket */
405405
net->last_errno= ER_NET_ERROR_ON_WRITE;
@@ -423,7 +423,7 @@ static ulong
423423
ma_real_read(NET *net, size_t *complen)
424424
{
425425
uchar *pos;
426-
size_t length;
426+
ssize_t length;
427427
uint i;
428428
ulong len=packet_error;
429429
size_t remain= (net->compress ? NET_HEADER_SIZE+COMP_HEADER_SIZE :
@@ -438,7 +438,7 @@ ma_real_read(NET *net, size_t *complen)
438438
while (remain > 0)
439439
{
440440
/* First read is done with non blocking mode */
441-
if ((ssize_t) (length=ma_pvio_cache_read(net->pvio, pos,remain)) <= 0L)
441+
if ((length=ma_pvio_cache_read(net->pvio, pos,remain)) <= 0L)
442442
{
443443
len= packet_error;
444444
net->error=2; /* Close socket */

libmariadb/ma_pvio.c

+12-10
Original file line numberDiff line numberDiff line change
@@ -216,9 +216,9 @@ static size_t ma_pvio_read_async(MARIADB_PVIO *pvio, uchar *buffer, size_t lengt
216216
/* }}} */
217217

218218
/* {{{ size_t ma_pvio_read */
219-
size_t ma_pvio_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length)
219+
ssize_t ma_pvio_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length)
220220
{
221-
size_t r= -1;
221+
ssize_t r= -1;
222222
if (!pvio)
223223
return -1;
224224
if (IS_PVIO_ASYNC_ACTIVE(pvio))
@@ -266,9 +266,9 @@ size_t ma_pvio_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length)
266266
/* }}} */
267267

268268
/* {{{ size_t ma_pvio_cache_read */
269-
size_t ma_pvio_cache_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length)
269+
ssize_t ma_pvio_cache_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length)
270270
{
271-
size_t r;
271+
ssize_t r;
272272

273273
if (!pvio)
274274
return -1;
@@ -278,7 +278,9 @@ size_t ma_pvio_cache_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length)
278278

279279
if (pvio->cache + pvio->cache_size > pvio->cache_pos)
280280
{
281-
r= MIN(length, (size_t)(pvio->cache + pvio->cache_size - pvio->cache_pos));
281+
ssize_t remaining = pvio->cache + pvio->cache_size - pvio->cache_pos;
282+
assert(remaining > 0);
283+
r= MIN((ssize_t)length, remaining);
282284
memcpy(buffer, pvio->cache_pos, r);
283285
pvio->cache_pos+= r;
284286
}
@@ -289,9 +291,9 @@ size_t ma_pvio_cache_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length)
289291
else
290292
{
291293
r= ma_pvio_read(pvio, pvio->cache, PVIO_READ_AHEAD_CACHE_SIZE);
292-
if ((ssize_t)r > 0)
294+
if (r > 0)
293295
{
294-
if (length < r)
296+
if (length < (size_t)r)
295297
{
296298
pvio->cache_size= r;
297299
pvio->cache_pos= pvio->cache + length;
@@ -305,7 +307,7 @@ size_t ma_pvio_cache_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length)
305307
/* }}} */
306308

307309
/* {{{ size_t ma_pvio_write_async */
308-
static size_t ma_pvio_write_async(MARIADB_PVIO *pvio, const uchar *buffer, size_t length)
310+
static ssize_t ma_pvio_write_async(MARIADB_PVIO *pvio, const uchar *buffer, size_t length)
309311
{
310312
ssize_t res;
311313
struct mysql_async_context *b= pvio->mysql->options.extension->async_context;
@@ -334,9 +336,9 @@ static size_t ma_pvio_write_async(MARIADB_PVIO *pvio, const uchar *buffer, size_
334336
/* }}} */
335337

336338
/* {{{ size_t ma_pvio_write */
337-
size_t ma_pvio_write(MARIADB_PVIO *pvio, const uchar *buffer, size_t length)
339+
ssize_t ma_pvio_write(MARIADB_PVIO *pvio, const uchar *buffer, size_t length)
338340
{
339-
size_t r;
341+
ssize_t r;
340342

341343
if (!pvio)
342344
return -1;

libmariadb/ma_tls.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,12 @@ my_bool ma_pvio_tls_connect(MARIADB_TLS *ctls)
8484
return rc;
8585
}
8686

87-
size_t ma_pvio_tls_read(MARIADB_TLS *ctls, const uchar* buffer, size_t length)
87+
ssize_t ma_pvio_tls_read(MARIADB_TLS *ctls, const uchar* buffer, size_t length)
8888
{
8989
return ma_tls_read(ctls, buffer, length);
9090
}
9191

92-
size_t ma_pvio_tls_write(MARIADB_TLS *ctls, const uchar* buffer, size_t length)
92+
ssize_t ma_pvio_tls_write(MARIADB_TLS *ctls, const uchar* buffer, size_t length)
9393
{
9494
return ma_tls_write(ctls, buffer, length);
9595
}

libmariadb/secure/ma_schannel.c

+20-17
Original file line numberDiff line numberDiff line change
@@ -445,12 +445,13 @@ SECURITY_STATUS ma_schannel_handshake_loop(MARIADB_PVIO *pvio, my_bool InitialRe
445445
{
446446
if(fDoRead)
447447
{
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)
450450
{
451451
rc = SEC_E_INTERNAL_ERROR;
452452
break;
453453
}
454+
cbData = (DWORD)nbytes;
454455
cbIoBuffer += cbData;
455456
}
456457
else
@@ -504,14 +505,14 @@ SECURITY_STATUS ma_schannel_handshake_loop(MARIADB_PVIO *pvio, my_bool InitialRe
504505
{
505506
if(OutBuffers.cbBuffer && OutBuffers.pvBuffer)
506507
{
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)
509510
{
510511
FreeContextBuffer(OutBuffers.pvBuffer);
511512
DeleteSecurityContext(&sctx->ctxt);
512513
return SEC_E_INTERNAL_ERROR;
513514
}
514-
515+
cbData= (DWORD)nbytes;
515516
/* Free output context buffer */
516517
FreeContextBuffer(OutBuffers.pvBuffer);
517518
OutBuffers.pvBuffer = NULL;
@@ -648,12 +649,13 @@ SECURITY_STATUS ma_schannel_client_handshake(MARIADB_TLS *ctls)
648649
/* send client hello packaet */
649650
if(BuffersOut.cbBuffer != 0 && BuffersOut.pvBuffer != NULL)
650651
{
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)
653654
{
654655
sRet= SEC_E_INTERNAL_ERROR;
655656
goto end;
656657
}
658+
r = (DWORD)nbytes;
657659
}
658660
sRet= ma_schannel_handshake_loop(pvio, TRUE, &ExtraData);
659661

@@ -708,7 +710,7 @@ SECURITY_STATUS ma_schannel_read_decrypt(MARIADB_PVIO *pvio,
708710
uchar *ReadBuffer,
709711
DWORD ReadBufferSize)
710712
{
711-
DWORD dwBytesRead= 0;
713+
ssize_t nbytes= 0;
712714
DWORD dwOffset= 0;
713715
SC_CTX *sctx;
714716
SECURITY_STATUS sRet= 0;
@@ -725,22 +727,22 @@ SECURITY_STATUS ma_schannel_read_decrypt(MARIADB_PVIO *pvio,
725727

726728
while (1)
727729
{
728-
if (!dwBytesRead || sRet == SEC_E_INCOMPLETE_MESSAGE)
730+
if (nbytes > 0 || sRet == SEC_E_INCOMPLETE_MESSAGE)
729731
{
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)
732734
{
733735
/* server closed connection */
734736
// todo: error
735737
return SEC_E_INVALID_HANDLE;
736738
}
737-
if (dwBytesRead < 0)
739+
if (nbytes < 0)
738740
{
739741
/* socket error */
740742
// todo: error
741743
return SEC_E_INVALID_HANDLE;
742744
}
743-
dwOffset+= dwBytesRead;
745+
dwOffset+= (DWORD)nbytes;
744746
}
745747
ZeroMemory(Buffers, sizeof(SecBuffer) * 4);
746748
Buffers[0].pvBuffer= sctx->IoBuffer;
@@ -779,6 +781,7 @@ SECURITY_STATUS ma_schannel_read_decrypt(MARIADB_PVIO *pvio,
779781

780782
if (pData && pData->cbBuffer)
781783
{
784+
assert(*DecryptLength + pData->cbBuffer <= ReadBufferSize);
782785
memcpy(ReadBuffer + *DecryptLength, pData->pvBuffer, pData->cbBuffer);
783786
*DecryptLength+= pData->cbBuffer;
784787
return sRet;
@@ -893,7 +896,7 @@ my_bool ma_schannel_verify_certs(SC_CTX *sctx)
893896
SEC_E_OK on success
894897
SEC_E_* if an error occured
895898
*/
896-
size_t ma_schannel_write_encrypt(MARIADB_PVIO *pvio,
899+
ssize_t ma_schannel_write_encrypt(MARIADB_PVIO *pvio,
897900
uchar *WriteBuffer,
898901
size_t WriteBufferSize)
899902
{
@@ -904,6 +907,7 @@ size_t ma_schannel_write_encrypt(MARIADB_PVIO *pvio,
904907
PBYTE pbMessage;
905908
SC_CTX *sctx= (SC_CTX *)pvio->ctls->ssl;
906909
size_t payload;
910+
ssize_t nbytes;
907911

908912
payload= MIN(WriteBufferSize, sctx->IoBufferSize);
909913

@@ -934,9 +938,8 @@ size_t ma_schannel_write_encrypt(MARIADB_PVIO *pvio,
934938
if ((scRet = EncryptMessage(&sctx->ctxt, 0, &Message, 0))!= SEC_E_OK)
935939
return -1;
936940

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;
940943
}
941944
/* }}} */
942945

libmariadb/secure/ma_schannel.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ SECURITY_STATUS ma_schannel_handshake_loop(MARIADB_PVIO *pvio, my_bool InitialRe
6969
my_bool ma_schannel_load_private_key(MARIADB_PVIO *pvio, CERT_CONTEXT *ctx, char *key_file);
7070
PCCRL_CONTEXT ma_schannel_create_crl_context(MARIADB_PVIO *pvio, const char *pem_file);
7171
my_bool ma_schannel_verify_certs(SC_CTX *sctx);
72-
size_t ma_schannel_write_encrypt(MARIADB_PVIO *pvio,
72+
ssize_t ma_schannel_write_encrypt(MARIADB_PVIO *pvio,
7373
uchar *WriteBuffer,
7474
size_t WriteBufferSize);
7575
SECURITY_STATUS ma_schannel_read_decrypt(MARIADB_PVIO *pvio,

libmariadb/secure/schannel.c

+8-9
Original file line numberDiff line numberDiff line change
@@ -301,24 +301,23 @@ my_bool ma_tls_connect(MARIADB_TLS *ctls)
301301
return 1;
302302
}
303303

304-
size_t ma_tls_read(MARIADB_TLS *ctls, const uchar* buffer, size_t length)
304+
ssize_t ma_tls_read(MARIADB_TLS *ctls, const uchar* buffer, size_t length)
305305
{
306306
SC_CTX *sctx= (SC_CTX *)ctls->ssl;
307307
MARIADB_PVIO *pvio= sctx->mysql->net.pvio;
308-
DWORD dlength= -1;
309-
310-
ma_schannel_read_decrypt(pvio, &sctx->CredHdl, &sctx->ctxt, &dlength, (uchar *)buffer, (DWORD)length);
311-
return dlength;
308+
DWORD dlength= 0;
309+
SECURITY_STATUS status = ma_schannel_read_decrypt(pvio, &sctx->CredHdl, &sctx->ctxt, &dlength, (uchar *)buffer, (DWORD)length);
310+
return (status == SEC_E_OK)? (ssize_t)dlength : -1;
312311
}
313312

314-
size_t ma_tls_write(MARIADB_TLS *ctls, const uchar* buffer, size_t length)
313+
ssize_t ma_tls_write(MARIADB_TLS *ctls, const uchar* buffer, size_t length)
315314
{
316315
SC_CTX *sctx= (SC_CTX *)ctls->ssl;
317316
MARIADB_PVIO *pvio= sctx->mysql->net.pvio;
318-
size_t rc, wlength= 0;
319-
size_t remain= length;
317+
ssize_t rc, wlength= 0;
318+
ssize_t remain= length;
320319

321-
while (remain)
320+
while (remain > 0)
322321
{
323322
if ((rc= ma_schannel_write_encrypt(pvio, (uchar *)buffer + wlength, remain)) <= 0)
324323
return rc;

0 commit comments

Comments
 (0)