@@ -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 */
598598static 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
986997socklen_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 */
31843159WOLFSSL_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