Skip to content

Commit b17755b

Browse files
authored
Merge pull request #10164 from rizlik/bio
BIO improvements and fixes
2 parents a143369 + b30e0f6 commit b17755b

5 files changed

Lines changed: 216 additions & 104 deletions

File tree

src/bio.c

Lines changed: 81 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ static int wolfSSL_BIO_MEMORY_read(WOLFSSL_BIO* bio, void* buf, int len)
164164
/* Resize the memory so we are not taking up more than necessary.
165165
* memmove reverts internally to memcpy if areas don't overlap */
166166
XMEMMOVE(bio->mem_buf->data, bio->mem_buf->data + bio->rdIdx,
167-
(long unsigned int)bio->wrSz - (size_t)bio->rdIdx);
167+
(size_t)bio->wrSz - (size_t)bio->rdIdx);
168168
bio->wrSz -= bio->rdIdx;
169169
bio->rdIdx = 0;
170170
/* Resize down to WOLFSSL_BIO_RESIZE_THRESHOLD for fewer
@@ -592,34 +592,40 @@ static int wolfSSL_BIO_BIO_write(WOLFSSL_BIO* bio, const void* data,
592592
* data buffer holding the data to be written
593593
* len length of data buffer
594594
*
595-
* returns the amount of data written on success and WOLFSSL_FAILURE or
596-
* WOLFSSL_BIO_ERROR for failure cases.
595+
* returns the amount of data written on success or WOLFSSL_BIO_ERROR
596+
* for failure cases.
597597
*/
598598
static int wolfSSL_BIO_MEMORY_write(WOLFSSL_BIO* bio, const void* data,
599599
int len)
600600
{
601601
WOLFSSL_ENTER("wolfSSL_BIO_MEMORY_write");
602602

603-
if (bio == NULL || bio->mem_buf == NULL || data == NULL) {
603+
/* ossl returns 0 on bio == NULL */
604+
if (bio == NULL) {
605+
return 0;
606+
}
607+
608+
if (bio->mem_buf == NULL || data == NULL) {
604609
WOLFSSL_MSG("one of input parameters is null");
605-
return WOLFSSL_FAILURE;
610+
return WOLFSSL_BIO_ERROR;
606611
}
612+
607613
if (bio->flags & WOLFSSL_BIO_FLAG_MEM_RDONLY) {
608-
return WOLFSSL_FAILURE;
614+
return WOLFSSL_BIO_ERROR;
609615
}
610616

611-
if (len == 0)
612-
return WOLFSSL_SUCCESS; /* Return early to make logic simpler */
617+
if (len <= 0)
618+
return 0; /* Nothing to write */
613619

614620
if (wolfSSL_BUF_MEM_grow_ex(bio->mem_buf, ((size_t)bio->wrSz) +
615621
((size_t)len), 0) == 0) {
616622
WOLFSSL_MSG("Error growing memory area");
617-
return WOLFSSL_FAILURE;
623+
return WOLFSSL_BIO_ERROR;
618624
}
619625

620626
if (bio->mem_buf->data == NULL) {
621627
WOLFSSL_MSG("Buffer data is NULL");
622-
return WOLFSSL_FAILURE;
628+
return WOLFSSL_BIO_ERROR;
623629
}
624630

625631
XMEMCPY(bio->mem_buf->data + bio->wrSz, data, (size_t)len);
@@ -868,7 +874,11 @@ long wolfSSL_BIO_ctrl(WOLFSSL_BIO *bio, int cmd, long larg, void *parg)
868874

869875
WOLFSSL_ENTER("wolfSSL_BIO_ctrl");
870876

871-
if (bio && bio->method && bio->method->ctrlCb) {
877+
if (bio == NULL) {
878+
return WOLFSSL_FAILURE;
879+
}
880+
881+
if (bio->method && bio->method->ctrlCb) {
872882
return bio->method->ctrlCb(bio, cmd, larg, parg);
873883
}
874884

@@ -952,6 +962,7 @@ int wolfSSL_BIO_up_ref(WOLFSSL_BIO* bio)
952962
#ifdef WOLFSSL_REFCNT_ERROR_RETURN
953963
if (ret != 0) {
954964
WOLFSSL_MSG("Failed to lock BIO mutex");
965+
return WOLFSSL_FAILURE;
955966
}
956967
#else
957968
(void)ret;
@@ -984,6 +995,8 @@ void wolfSSL_BIO_ADDR_clear(WOLFSSL_BIO_ADDR *addr) {
984995
}
985996

986997
socklen_t wolfSSL_BIO_ADDR_size(const WOLFSSL_BIO_ADDR *addr) {
998+
if (addr == NULL)
999+
return 0;
9871000
switch (addr->sa.sa_family) {
9881001
#ifndef WOLFSSL_NO_BIO_ADDR_IN
9891002
case AF_INET:
@@ -1101,20 +1114,17 @@ int wolfSSL_BIO_gets(WOLFSSL_BIO* bio, char* buf, int sz)
11011114
}
11021115

11031116
cSz = wolfSSL_getLineLength((char*)c, cSz);
1104-
/* check case where line was bigger then buffer and buffer
1105-
* needs end terminator */
11061117
if (cSz >= sz) {
11071118
cSz = sz - 1;
1108-
buf[cSz] = '\0';
1109-
}
1110-
else {
1111-
/* not minus 1 here because placing terminator after
1112-
msg and have checked that sz is large enough */
1113-
buf[cSz] = '\0';
11141119
}
11151120

11161121
ret = wolfSSL_BIO_MEMORY_read(bio, (void*)buf, cSz);
1117-
/* ret is read after the switch statement */
1122+
if (ret > 0) {
1123+
buf[ret] = '\0';
1124+
}
1125+
else {
1126+
buf[0] = '\0';
1127+
}
11181128
break;
11191129
}
11201130
case WOLFSSL_BIO_BIO:
@@ -1129,21 +1139,17 @@ int wolfSSL_BIO_gets(WOLFSSL_BIO* bio, char* buf, int sz)
11291139
}
11301140

11311141
cSz = wolfSSL_getLineLength(c, cSz);
1132-
/* check case where line was bigger then buffer and buffer
1133-
* needs end terminator */
11341142
if (cSz >= sz) {
11351143
cSz = sz - 1;
1136-
buf[cSz] = '\0';
1137-
}
1138-
else {
1139-
/* not minus 1 here because placing terminator after
1140-
msg and have checked that sz is large enough */
1141-
buf[cSz] = '\0';
11421144
}
11431145

11441146
ret = wolfSSL_BIO_nread(bio, &c, cSz);
1145-
if (ret > 0 && ret < sz) {
1147+
if (ret > 0) {
11461148
XMEMCPY(buf, c, (size_t)ret);
1149+
buf[ret] = '\0';
1150+
}
1151+
else {
1152+
buf[0] = '\0';
11471153
}
11481154
break;
11491155
}
@@ -1299,51 +1305,42 @@ size_t wolfSSL_BIO_ctrl_pending(WOLFSSL_BIO *bio)
12991305
WOLFSSL_ENTER("wolfSSL_BIO_ctrl_pending");
13001306
#endif
13011307

1302-
if (bio == NULL) {
1303-
return 0;
1304-
}
1305-
1306-
if (bio->method != NULL && bio->method->ctrlCb != NULL) {
1307-
long ret;
1308-
WOLFSSL_MSG("Calling custom BIO ctrl pending callback");
1309-
ret = bio->method->ctrlCb(bio, WOLFSSL_BIO_CTRL_PENDING, 0, NULL);
1310-
return (ret < 0) ? 0 : (size_t)ret;
1311-
}
1312-
1313-
if (bio->type == WOLFSSL_BIO_MD ||
1314-
bio->type == WOLFSSL_BIO_BASE64) {
1315-
/* these are wrappers only, get next bio */
1316-
while (bio->next != NULL) {
1317-
bio = bio->next;
1318-
if (bio->type == WOLFSSL_BIO_MD ||
1319-
bio->type == WOLFSSL_BIO_BASE64) {
1320-
break;
1321-
}
1308+
for (; bio != NULL; bio = bio->next) {
1309+
if (bio->method != NULL && bio->method->ctrlCb != NULL) {
1310+
long ret;
1311+
WOLFSSL_MSG("Calling custom BIO ctrl pending callback");
1312+
ret = bio->method->ctrlCb(bio, WOLFSSL_BIO_CTRL_PENDING, 0, NULL);
1313+
return (ret < 0) ? 0 : (size_t)ret;
13221314
}
1323-
}
13241315

1316+
switch (bio->type) {
1317+
case WOLFSSL_BIO_MD:
1318+
case WOLFSSL_BIO_BASE64:
1319+
/* wrappers only, skip to next bio in chain */
1320+
continue;
13251321
#ifndef WOLFCRYPT_ONLY
1326-
if (bio->type == WOLFSSL_BIO_SSL && bio->ptr.ssl != NULL) {
1327-
return (size_t)wolfSSL_pending(bio->ptr.ssl);
1328-
}
1322+
case WOLFSSL_BIO_SSL:
1323+
if (bio->ptr.ssl != NULL)
1324+
return (size_t)wolfSSL_pending(bio->ptr.ssl);
1325+
return 0;
13291326
#endif
1330-
1331-
if (bio->type == WOLFSSL_BIO_MEMORY) {
1332-
return (size_t)(bio->wrSz - bio->rdIdx);
1333-
}
1334-
1335-
/* type BIO_BIO then check paired buffer */
1336-
if (bio->type == WOLFSSL_BIO_BIO && bio->pair != NULL) {
1337-
WOLFSSL_BIO* pair = bio->pair;
1338-
if (pair->wrIdx > 0 && pair->wrIdx <= pair->rdIdx) {
1339-
/* in wrap around state where beginning of buffer is being
1340-
* overwritten */
1341-
return ((size_t)pair->wrSz) - ((size_t)pair->rdIdx) +
1342-
((size_t)pair->wrIdx);
1343-
}
1344-
else {
1345-
/* simple case where has not wrapped around */
1346-
return (size_t)(pair->wrIdx - pair->rdIdx);
1327+
case WOLFSSL_BIO_MEMORY:
1328+
return (size_t)(bio->wrSz - bio->rdIdx);
1329+
case WOLFSSL_BIO_BIO:
1330+
if (bio->pair != NULL) {
1331+
WOLFSSL_BIO* pair = bio->pair;
1332+
if (pair->wrIdx > 0 && pair->wrIdx <= pair->rdIdx) {
1333+
/* wrap around state */
1334+
return ((size_t)pair->wrSz) - ((size_t)pair->rdIdx) +
1335+
((size_t)pair->wrIdx);
1336+
}
1337+
else {
1338+
return (size_t)(pair->wrIdx - pair->rdIdx);
1339+
}
1340+
}
1341+
return 0;
1342+
default:
1343+
return 0;
13471344
}
13481345
}
13491346
return 0;
@@ -1827,7 +1824,7 @@ long wolfSSL_BIO_get_fp(WOLFSSL_BIO *bio, XFILE* fp)
18271824
{
18281825
WOLFSSL_ENTER("wolfSSL_BIO_get_fp");
18291826

1830-
if (bio == NULL || fp == XBADFILE) {
1827+
if (bio == NULL || fp == NULL) {
18311828
return WOLFSSL_FAILURE;
18321829
}
18331830

@@ -2094,7 +2091,7 @@ WOLFSSL_BIO_METHOD *wolfSSL_BIO_meth_new(int type, const char *name)
20942091
return NULL;
20952092
}
20962093
XMEMSET(meth, 0, sizeof(WOLFSSL_BIO_METHOD));
2097-
meth->type = (byte)type;
2094+
meth->type = type;
20982095
XSTRNCPY(meth->name, name, MAX_BIO_METHOD_NAME - 1);
20992096

21002097
return meth;
@@ -2830,39 +2827,17 @@ int wolfSSL_BIO_flush(WOLFSSL_BIO* bio)
28302827
}
28312828

28322829
newLen = XSTRLEN(name);
2830+
if (b->ip != NULL && XSTRLEN(b->ip) != newLen) {
2831+
XFREE(b->ip, b->heap, DYNAMIC_TYPE_OPENSSL);
2832+
b->ip = NULL;
2833+
}
28332834
if (b->ip == NULL) {
2834-
/* +1 for null char */
28352835
b->ip = (char*)XMALLOC(newLen + 1, b->heap, DYNAMIC_TYPE_OPENSSL);
28362836
if (b->ip == NULL) {
28372837
WOLFSSL_MSG("Hostname malloc failed.");
28382838
return WOLFSSL_FAILURE;
28392839
}
28402840
}
2841-
else {
2842-
size_t currLen = XSTRLEN(b->ip);
2843-
#ifdef WOLFSSL_NO_REALLOC
2844-
char* tmp = NULL;
2845-
#endif
2846-
2847-
if (currLen != newLen) {
2848-
#ifdef WOLFSSL_NO_REALLOC
2849-
tmp = b->ip;
2850-
b->ip = (char*)XMALLOC(newLen+1, b->heap, DYNAMIC_TYPE_OPENSSL);
2851-
if (b->ip != NULL && tmp != NULL) {
2852-
XMEMCPY(b->ip, tmp, newLen);
2853-
XFREE(tmp, b->heap, DYNAMIC_TYPE_OPENSSL);
2854-
tmp = NULL;
2855-
}
2856-
#else
2857-
b->ip = (char*)XREALLOC(b->ip, newLen + 1, b->heap,
2858-
DYNAMIC_TYPE_OPENSSL);
2859-
#endif
2860-
if (b->ip == NULL) {
2861-
WOLFSSL_MSG("Hostname realloc failed.");
2862-
return WOLFSSL_FAILURE;
2863-
}
2864-
}
2865-
}
28662841

28672842
XMEMCPY(b->ip, name, newLen);
28682843
b->ip[newLen] = '\0';
@@ -2913,7 +2888,7 @@ int wolfSSL_BIO_flush(WOLFSSL_BIO* bio)
29132888
DYNAMIC_TYPE_OPENSSL);
29142889
if (bio) {
29152890
XMEMSET(bio, 0, sizeof(WOLFSSL_BIO));
2916-
bio->type = (byte)method->type;
2891+
bio->type = method->type;
29172892
#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
29182893
bio->method = (WOLFSSL_BIO_METHOD*)method;
29192894
#else
@@ -3183,6 +3158,8 @@ int wolfSSL_BIO_flush(WOLFSSL_BIO* bio)
31833158
*/
31843159
WOLFSSL_BIO* wolfSSL_BIO_pop(WOLFSSL_BIO* bio)
31853160
{
3161+
WOLFSSL_BIO* next;
3162+
31863163
if (bio == NULL) {
31873164
WOLFSSL_MSG("Bad argument passed in");
31883165
return NULL;
@@ -3196,7 +3173,11 @@ WOLFSSL_BIO* wolfSSL_BIO_pop(WOLFSSL_BIO* bio)
31963173
bio->next->prev = bio->prev;
31973174
}
31983175

3199-
return bio->next;
3176+
next = bio->next;
3177+
bio->prev = NULL;
3178+
bio->next = NULL;
3179+
3180+
return next;
32003181
}
32013182

32023183

0 commit comments

Comments
 (0)