Merge I/O contexts into one
diff --git a/library/ssl_tls.c b/library/ssl_tls.c
index 51a0ac7..126fbae 100644
--- a/library/ssl_tls.c
+++ b/library/ssl_tls.c
@@ -1842,6 +1842,13 @@
SSL_DEBUG_MSG( 2, ( "=> fetch input" ) );
+ if( ssl->f_recv == NULL && ssl->f_recv_timeout == NULL )
+ {
+ SSL_DEBUG_MSG( 1, ( "Bad usage of ssl_set_bio() "
+ "or ssl_set_bio_timeout()" ) );
+ return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
+ }
+
if( nb_want > SSL_BUFFER_LEN - (size_t)( ssl->in_hdr - ssl->in_buf ) )
{
SSL_DEBUG_MSG( 1, ( "requesting more data than fits" ) );
@@ -1907,7 +1914,7 @@
}
len = SSL_BUFFER_LEN - ( ssl->in_hdr - ssl->in_buf );
- ret = ssl->f_recv( ssl->p_recv, ssl->in_hdr, len );
+ ret = ssl->f_recv( ssl->p_bio, ssl->in_hdr, len );
SSL_DEBUG_RET( 2, "ssl->f_recv", ret );
@@ -1928,7 +1935,7 @@
while( ssl->in_left < nb_want )
{
len = nb_want - ssl->in_left;
- ret = ssl->f_recv( ssl->p_recv, ssl->in_hdr + ssl->in_left, len );
+ ret = ssl->f_recv( ssl->p_bio, ssl->in_hdr + ssl->in_left, len );
SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d",
ssl->in_left, nb_want ) );
@@ -1959,6 +1966,13 @@
SSL_DEBUG_MSG( 2, ( "=> flush output" ) );
+ if( ssl->f_send == NULL )
+ {
+ SSL_DEBUG_MSG( 1, ( "Bad usage of ssl_set_bio() "
+ "or ssl_set_bio_timeout()" ) );
+ return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
+ }
+
/* Avoid incrementing counter if data is flushed */
if( ssl->out_left == 0 )
{
@@ -1973,7 +1987,7 @@
buf = ssl->out_hdr + ssl_hdr_len( ssl ) +
ssl->out_msglen - ssl->out_left;
- ret = ssl->f_send( ssl->p_send, buf, ssl->out_left );
+ ret = ssl->f_send( ssl->p_bio, buf, ssl->out_left );
SSL_DEBUG_RET( 2, "ssl->f_send", ret );
@@ -4299,10 +4313,17 @@
int (*f_recv)(void *, unsigned char *, size_t), void *p_recv,
int (*f_send)(void *, const unsigned char *, size_t), void *p_send )
{
+ if( p_recv != p_send )
+ {
+ ssl->f_recv = NULL;
+ ssl->f_send = NULL;
+ ssl->p_bio = NULL;
+ return;
+ }
+
ssl->f_recv = f_recv;
ssl->f_send = f_send;
- ssl->p_recv = p_recv;
- ssl->p_send = p_send;
+ ssl->p_bio = p_send;
}
void ssl_set_session_cache( ssl_context *ssl,