mbedtls: update and integrate upstream fixes.
This commit is contained in:
		
							parent
							
								
									524a98ed1a
								
							
						
					
					
						commit
						9277bea8c9
					
				
					 3 changed files with 157 additions and 46 deletions
				
			
		| 
						 | 
				
			
			@ -26,7 +26,7 @@ OBJS_CRYPTO=	aes.o		aesni.o		arc4.o		\
 | 
			
		|||
		padlock.o	pem.o		pk.o		\
 | 
			
		||||
		pk_wrap.o	pkcs12.o	pkcs5.o		\
 | 
			
		||||
		pkparse.o	pkwrite.o	platform.o	\
 | 
			
		||||
		ripemd160.o	rsa.o		sha1.o		\
 | 
			
		||||
		ripemd160.o	rsa.o		rsa_internal.o	sha1.o		\
 | 
			
		||||
		sha256.o	sha512.o	threading.o	\
 | 
			
		||||
		timing.o	version.o			\
 | 
			
		||||
		version_features.o		xtea.o
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1 +1 @@
 | 
			
		|||
Subproject commit f2a597fa3dd1c7b15e0fee62f6932b253295803d
 | 
			
		||||
Subproject commit 1bf6123fca97a9a35c2f403ab0c96495f9580db6
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
/*
 | 
			
		||||
 *  TCP/IP or UDP/IP networking functions
 | 
			
		||||
 *  modified for LWIP support on ESP8266
 | 
			
		||||
 *  Based on mbedtls/library/net_sockets.c
 | 
			
		||||
 *  Modified for LWIP support on ESP8266
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
 | 
			
		||||
 *  Additions Copyright (C) 2015 Angus Gratton
 | 
			
		||||
| 
						 | 
				
			
			@ -21,7 +22,6 @@
 | 
			
		|||
 *  This file is part of mbed TLS (https://tls.mbed.org)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#if !defined(MBEDTLS_CONFIG_FILE)
 | 
			
		||||
#include "mbedtls/config.h"
 | 
			
		||||
#else
 | 
			
		||||
| 
						 | 
				
			
			@ -30,18 +30,74 @@
 | 
			
		|||
 | 
			
		||||
#if defined(MBEDTLS_NET_C)
 | 
			
		||||
 | 
			
		||||
#define ESP_OPEN_RTOS 1
 | 
			
		||||
#define _SOCKLEN_T_DECLARED 1
 | 
			
		||||
 | 
			
		||||
#if !defined(unix) && !defined(__unix__) && !defined(__unix) &&         \
 | 
			
		||||
    !defined(__APPLE__) && !defined(_WIN32) && !defined(ESP_OPEN_RTOS)
 | 
			
		||||
#error "This module only works on Unix and Windows, see MBEDTLS_NET_C in config.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_PLATFORM_C)
 | 
			
		||||
#include "mbedtls/platform.h"
 | 
			
		||||
#else
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "mbedtls/net_sockets.h"
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#if (defined(_WIN32) || defined(_WIN32_WCE)) && !defined(EFIX64) && \
 | 
			
		||||
    !defined(EFI32)
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN32_WINNT
 | 
			
		||||
#undef _WIN32_WINNT
 | 
			
		||||
#endif
 | 
			
		||||
/* Enables getaddrinfo() & Co */
 | 
			
		||||
#define _WIN32_WINNT 0x0501
 | 
			
		||||
#include <ws2tcpip.h>
 | 
			
		||||
 | 
			
		||||
#include <winsock2.h>
 | 
			
		||||
#include <windows.h>
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER)
 | 
			
		||||
#if defined(_WIN32_WCE)
 | 
			
		||||
#pragma comment( lib, "ws2.lib" )
 | 
			
		||||
#else
 | 
			
		||||
#pragma comment( lib, "ws2_32.lib" )
 | 
			
		||||
#endif
 | 
			
		||||
#endif /* _MSC_VER */
 | 
			
		||||
 | 
			
		||||
#define read(fd,buf,len)        recv( fd, (char*)( buf ), (int)( len ), 0 )
 | 
			
		||||
#define write(fd,buf,len)       send( fd, (char*)( buf ), (int)( len ), 0 )
 | 
			
		||||
#define close(fd)               closesocket(fd)
 | 
			
		||||
 | 
			
		||||
static int wsa_init_done = 0;
 | 
			
		||||
 | 
			
		||||
#else /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/socket.h>
 | 
			
		||||
//#include <netinet/in.h>
 | 
			
		||||
#include <arpa/inet.h>
 | 
			
		||||
#include <sys/time.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <netdb.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#endif /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */
 | 
			
		||||
 | 
			
		||||
/* Some MS functions want int and MSVC warns if we pass size_t,
 | 
			
		||||
 * but the standard functions use socklen_t, so cast only for MSVC */
 | 
			
		||||
#if defined(_MSC_VER)
 | 
			
		||||
#define MSVC_INT_CAST   (int)
 | 
			
		||||
#else
 | 
			
		||||
#define MSVC_INT_CAST
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#include <time.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -65,6 +121,9 @@ static int net_prepare( void )
 | 
			
		|||
        wsa_init_done = 1;
 | 
			
		||||
    }
 | 
			
		||||
#else
 | 
			
		||||
#if !defined(EFIX64) && !defined(EFI32) && !defined(ESP_OPEN_RTOS)
 | 
			
		||||
    signal( SIGPIPE, SIG_IGN );
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
    return( 0 );
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -80,7 +139,8 @@ void mbedtls_net_init( mbedtls_net_context *ctx )
 | 
			
		|||
/*
 | 
			
		||||
 * Initiate a TCP connection with host:port and the given protocol
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_net_connect( mbedtls_net_context *ctx, const char *host, const char *port, int proto )
 | 
			
		||||
int mbedtls_net_connect( mbedtls_net_context *ctx, const char *host,
 | 
			
		||||
                         const char *port, int proto )
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    struct addrinfo hints, *addr_list, *cur;
 | 
			
		||||
| 
						 | 
				
			
			@ -109,7 +169,11 @@ int mbedtls_net_connect( mbedtls_net_context *ctx, const char *host, const char
 | 
			
		|||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if( connect( ctx->fd, cur->ai_addr, cur->ai_addrlen ) == 0 )
 | 
			
		||||
        const struct timeval timeout = { 60, 0 }; /* 60 second timeout */
 | 
			
		||||
        setsockopt( ctx->fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout) );
 | 
			
		||||
        setsockopt( ctx->fd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout) );
 | 
			
		||||
 | 
			
		||||
        if( connect( ctx->fd, cur->ai_addr, MSVC_INT_CAST cur->ai_addrlen ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            ret = 0;
 | 
			
		||||
            break;
 | 
			
		||||
| 
						 | 
				
			
			@ -130,14 +194,7 @@ int mbedtls_net_connect( mbedtls_net_context *ctx, const char *host, const char
 | 
			
		|||
int mbedtls_net_bind( mbedtls_net_context *ctx, const char *bind_ip, const char *port, int proto )
 | 
			
		||||
{
 | 
			
		||||
    int n, ret;
 | 
			
		||||
    struct addrinfo *addr_list, *cur;
 | 
			
		||||
 | 
			
		||||
    /* Only request desired protocol */
 | 
			
		||||
    const struct addrinfo hints = {
 | 
			
		||||
        .ai_family = AF_UNSPEC,
 | 
			
		||||
        .ai_socktype = (proto == MBEDTLS_NET_PROTO_UDP ? SOCK_DGRAM : SOCK_STREAM),
 | 
			
		||||
        .ai_protocol = (proto == MBEDTLS_NET_PROTO_UDP ? IPPROTO_UDP : IPPROTO_TCP),
 | 
			
		||||
    };
 | 
			
		||||
    struct addrinfo hints, *addr_list, *cur;
 | 
			
		||||
 | 
			
		||||
    struct sockaddr_in sockaddr_ipaddr_any = {
 | 
			
		||||
        .sin_len = sizeof(struct sockaddr_in),
 | 
			
		||||
| 
						 | 
				
			
			@ -148,8 +205,8 @@ int mbedtls_net_bind( mbedtls_net_context *ctx, const char *bind_ip, const char
 | 
			
		|||
 | 
			
		||||
    struct addrinfo all_interfaces_addr = {
 | 
			
		||||
        .ai_family = AF_INET,
 | 
			
		||||
        .ai_socktype = hints.ai_socktype,
 | 
			
		||||
        .ai_protocol = hints.ai_protocol,
 | 
			
		||||
        .ai_socktype = (proto == MBEDTLS_NET_PROTO_UDP ? SOCK_DGRAM : SOCK_STREAM),
 | 
			
		||||
        .ai_protocol = (proto == MBEDTLS_NET_PROTO_UDP ? IPPROTO_UDP : IPPROTO_TCP),
 | 
			
		||||
        .ai_addrlen = sizeof(struct sockaddr_in),
 | 
			
		||||
        .ai_addr = (struct sockaddr *)&sockaddr_ipaddr_any,
 | 
			
		||||
    };
 | 
			
		||||
| 
						 | 
				
			
			@ -157,14 +214,22 @@ int mbedtls_net_bind( mbedtls_net_context *ctx, const char *bind_ip, const char
 | 
			
		|||
    if( ( ret = net_prepare() ) != 0 )
 | 
			
		||||
        return( ret );
 | 
			
		||||
 | 
			
		||||
    if(bind_ip == NULL) {
 | 
			
		||||
    /* Bind to IPv6 and/or IPv4, but only in the desired protocol */
 | 
			
		||||
    memset( &hints, 0, sizeof( hints ) );
 | 
			
		||||
    hints.ai_family = AF_UNSPEC;
 | 
			
		||||
    hints.ai_socktype = proto == MBEDTLS_NET_PROTO_UDP ? SOCK_DGRAM : SOCK_STREAM;
 | 
			
		||||
    hints.ai_protocol = proto == MBEDTLS_NET_PROTO_UDP ? IPPROTO_UDP : IPPROTO_TCP;
 | 
			
		||||
    if( bind_ip == NULL )
 | 
			
		||||
        hints.ai_flags = AI_PASSIVE;
 | 
			
		||||
 | 
			
		||||
    if( bind_ip == NULL ) {
 | 
			
		||||
        /* mbedTLS docs specify bind_ip == NULL means all interfaces, but lwip getaddrinfo() assumes NULL
 | 
			
		||||
           means localhost. So we swap in a precreated IPADDR_ANY addrinfo result here. */
 | 
			
		||||
        addr_list = &all_interfaces_addr;
 | 
			
		||||
    }
 | 
			
		||||
    else if( getaddrinfo( bind_ip, port, &hints, &addr_list ) != 0 ) {
 | 
			
		||||
    else
 | 
			
		||||
    if( getaddrinfo( bind_ip, port, &hints, &addr_list ) != 0 )
 | 
			
		||||
        return( MBEDTLS_ERR_NET_UNKNOWN_HOST );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Try the sockaddrs until a binding succeeds */
 | 
			
		||||
    ret = MBEDTLS_ERR_NET_UNKNOWN_HOST;
 | 
			
		||||
| 
						 | 
				
			
			@ -187,7 +252,7 @@ int mbedtls_net_bind( mbedtls_net_context *ctx, const char *bind_ip, const char
 | 
			
		|||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if( bind( ctx->fd, cur->ai_addr, cur->ai_addrlen ) != 0 )
 | 
			
		||||
        if( bind( ctx->fd, cur->ai_addr, MSVC_INT_CAST cur->ai_addrlen ) != 0 )
 | 
			
		||||
        {
 | 
			
		||||
            close( ctx->fd );
 | 
			
		||||
            ret = MBEDTLS_ERR_NET_BIND_FAILED;
 | 
			
		||||
| 
						 | 
				
			
			@ -205,12 +270,12 @@ int mbedtls_net_bind( mbedtls_net_context *ctx, const char *bind_ip, const char
 | 
			
		|||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* I we ever get there, it's a success */
 | 
			
		||||
        /* Bind was successful */
 | 
			
		||||
        ret = 0;
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(bind_ip != NULL) {
 | 
			
		||||
    if( bind_ip != NULL ) {
 | 
			
		||||
        freeaddrinfo( addr_list );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -218,14 +283,18 @@ int mbedtls_net_bind( mbedtls_net_context *ctx, const char *bind_ip, const char
 | 
			
		|||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int socket_errno( const mbedtls_net_context *ctx )
 | 
			
		||||
#if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \
 | 
			
		||||
    !defined(EFI32)
 | 
			
		||||
/*
 | 
			
		||||
 * Check if the requested operation would be blocking on a non-blocking socket
 | 
			
		||||
 * and thus 'failed' with a negative return value.
 | 
			
		||||
 */
 | 
			
		||||
static int net_would_block( const mbedtls_net_context *ctx )
 | 
			
		||||
{
 | 
			
		||||
    int sock_errno = 0;
 | 
			
		||||
    u32_t optlen = sizeof(sock_errno);
 | 
			
		||||
    lwip_getsockopt(ctx->fd, SOL_SOCKET, SO_ERROR, &sock_errno, &optlen);
 | 
			
		||||
    return sock_errno;
 | 
			
		||||
    ((void) ctx);
 | 
			
		||||
    return( WSAGetLastError() == WSAEWOULDBLOCK );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
/*
 | 
			
		||||
 * Check if the requested operation would be blocking on a non-blocking socket
 | 
			
		||||
 * and thus 'failed' with a negative return value.
 | 
			
		||||
| 
						 | 
				
			
			@ -234,14 +303,18 @@ static int socket_errno( const mbedtls_net_context *ctx )
 | 
			
		|||
 */
 | 
			
		||||
static int net_would_block( const mbedtls_net_context *ctx )
 | 
			
		||||
{
 | 
			
		||||
    int err = errno;
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Never return 'WOULD BLOCK' on a non-blocking socket
 | 
			
		||||
     */
 | 
			
		||||
    if( ( fcntl( ctx->fd, F_GETFL, 0) & O_NONBLOCK ) != O_NONBLOCK )
 | 
			
		||||
    {
 | 
			
		||||
        errno = err;
 | 
			
		||||
        return( 0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    switch( socket_errno(ctx) )
 | 
			
		||||
    switch( errno = err )
 | 
			
		||||
    {
 | 
			
		||||
#if defined EAGAIN
 | 
			
		||||
        case EAGAIN:
 | 
			
		||||
| 
						 | 
				
			
			@ -253,6 +326,7 @@ static int net_would_block( const mbedtls_net_context *ctx )
 | 
			
		|||
    }
 | 
			
		||||
    return( 0 );
 | 
			
		||||
}
 | 
			
		||||
#endif /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Accept a connection from a remote client
 | 
			
		||||
| 
						 | 
				
			
			@ -264,14 +338,20 @@ int mbedtls_net_accept( mbedtls_net_context *bind_ctx,
 | 
			
		|||
    int ret;
 | 
			
		||||
    int type;
 | 
			
		||||
 | 
			
		||||
    struct sockaddr_in client_addr;
 | 
			
		||||
    struct sockaddr_storage client_addr;
 | 
			
		||||
 | 
			
		||||
#if defined(__socklen_t_defined) || defined(_SOCKLEN_T) ||  \
 | 
			
		||||
    defined(_SOCKLEN_T_DECLARED) || defined(__DEFINED_socklen_t)
 | 
			
		||||
    socklen_t n = (socklen_t) sizeof( client_addr );
 | 
			
		||||
    socklen_t type_len = (socklen_t) sizeof( type );
 | 
			
		||||
#else
 | 
			
		||||
    int n = (int) sizeof( client_addr );
 | 
			
		||||
    int type_len = (int) sizeof( type );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    /* Is this a TCP or UDP socket? */
 | 
			
		||||
    if( getsockopt( bind_ctx->fd, SOL_SOCKET, SO_TYPE,
 | 
			
		||||
                    (void *) &type, (socklen_t *) &type_len ) != 0 ||
 | 
			
		||||
                    (void *) &type, &type_len ) != 0 ||
 | 
			
		||||
        ( type != SOCK_STREAM && type != SOCK_DGRAM ) )
 | 
			
		||||
    {
 | 
			
		||||
        return( MBEDTLS_ERR_NET_ACCEPT_FAILED );
 | 
			
		||||
| 
						 | 
				
			
			@ -288,7 +368,7 @@ int mbedtls_net_accept( mbedtls_net_context *bind_ctx,
 | 
			
		|||
        /* UDP: wait for a message, but keep it in the queue */
 | 
			
		||||
        char buf[1] = { 0 };
 | 
			
		||||
 | 
			
		||||
        ret = recvfrom( bind_ctx->fd, buf, sizeof( buf ), MSG_PEEK,
 | 
			
		||||
        ret = (int) recvfrom( bind_ctx->fd, buf, sizeof( buf ), MSG_PEEK,
 | 
			
		||||
                        (struct sockaddr *) &client_addr, &n );
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
| 
						 | 
				
			
			@ -313,7 +393,7 @@ int mbedtls_net_accept( mbedtls_net_context *bind_ctx,
 | 
			
		|||
     * then bind a new socket to accept new connections */
 | 
			
		||||
    if( type != SOCK_STREAM )
 | 
			
		||||
    {
 | 
			
		||||
        struct sockaddr_in local_addr;
 | 
			
		||||
        struct sockaddr_storage local_addr;
 | 
			
		||||
        int one = 1;
 | 
			
		||||
 | 
			
		||||
        if( connect( bind_ctx->fd, (struct sockaddr *) &client_addr, n ) != 0 )
 | 
			
		||||
| 
						 | 
				
			
			@ -322,10 +402,10 @@ int mbedtls_net_accept( mbedtls_net_context *bind_ctx,
 | 
			
		|||
        client_ctx->fd = bind_ctx->fd;
 | 
			
		||||
        bind_ctx->fd   = -1; /* In case we exit early */
 | 
			
		||||
 | 
			
		||||
        n = sizeof( struct sockaddr_in );
 | 
			
		||||
        n = sizeof( struct sockaddr_storage );
 | 
			
		||||
        if( getsockname( client_ctx->fd,
 | 
			
		||||
                         (struct sockaddr *) &local_addr, &n ) != 0 ||
 | 
			
		||||
            ( bind_ctx->fd = (int) socket( AF_INET,
 | 
			
		||||
            ( bind_ctx->fd = (int) socket( local_addr.ss_family,
 | 
			
		||||
                                           SOCK_DGRAM, IPPROTO_UDP ) ) < 0 ||
 | 
			
		||||
            setsockopt( bind_ctx->fd, SOL_SOCKET, SO_REUSEADDR,
 | 
			
		||||
                        (const char *) &one, sizeof( one ) ) != 0 )
 | 
			
		||||
| 
						 | 
				
			
			@ -341,6 +421,8 @@ int mbedtls_net_accept( mbedtls_net_context *bind_ctx,
 | 
			
		|||
 | 
			
		||||
    if( client_ip != NULL )
 | 
			
		||||
    {
 | 
			
		||||
        if( client_addr.ss_family == AF_INET )
 | 
			
		||||
        {
 | 
			
		||||
            struct sockaddr_in *addr4 = (struct sockaddr_in *) &client_addr;
 | 
			
		||||
            *ip_len = sizeof( addr4->sin_addr.s_addr );
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -348,6 +430,19 @@ int mbedtls_net_accept( mbedtls_net_context *bind_ctx,
 | 
			
		|||
                return( MBEDTLS_ERR_NET_BUFFER_TOO_SMALL );
 | 
			
		||||
 | 
			
		||||
            memcpy( client_ip, &addr4->sin_addr.s_addr, *ip_len );
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
#if LWIP_IPV6
 | 
			
		||||
            struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) &client_addr;
 | 
			
		||||
            *ip_len = sizeof( addr6->sin6_addr.s6_addr );
 | 
			
		||||
 | 
			
		||||
            if( buf_size < *ip_len )
 | 
			
		||||
                return( MBEDTLS_ERR_NET_BUFFER_TOO_SMALL );
 | 
			
		||||
 | 
			
		||||
            memcpy( client_ip, &addr6->sin6_addr.s6_addr, *ip_len);
 | 
			
		||||
#endif
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
| 
						 | 
				
			
			@ -398,7 +493,9 @@ void mbedtls_net_usleep( unsigned long usec )
 | 
			
		|||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Read at most 'len' characters */
 | 
			
		||||
/*
 | 
			
		||||
 * Read at most 'len' characters
 | 
			
		||||
 */
 | 
			
		||||
int mbedtls_net_recv( void *ctx, unsigned char *buf, size_t len )
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
| 
						 | 
				
			
			@ -414,13 +511,17 @@ int mbedtls_net_recv( void *ctx, unsigned char *buf, size_t len )
 | 
			
		|||
        if( net_would_block( ctx ) != 0 )
 | 
			
		||||
            return( MBEDTLS_ERR_SSL_WANT_READ );
 | 
			
		||||
 | 
			
		||||
        int sock_errno = socket_errno(ctx);
 | 
			
		||||
 | 
			
		||||
        if( sock_errno == EPIPE || sock_errno == ECONNRESET )
 | 
			
		||||
#if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \
 | 
			
		||||
    !defined(EFI32)
 | 
			
		||||
        if( WSAGetLastError() == WSAECONNRESET )
 | 
			
		||||
            return( MBEDTLS_ERR_NET_CONN_RESET );
 | 
			
		||||
#else
 | 
			
		||||
        if( errno == EPIPE || errno == ECONNRESET )
 | 
			
		||||
            return( MBEDTLS_ERR_NET_CONN_RESET );
 | 
			
		||||
 | 
			
		||||
        if( sock_errno == EINTR )
 | 
			
		||||
        if( errno == EINTR )
 | 
			
		||||
            return( MBEDTLS_ERR_SSL_WANT_READ );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        return( MBEDTLS_ERR_NET_RECV_FAILED );
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -456,8 +557,14 @@ int mbedtls_net_recv_timeout( void *ctx, unsigned char *buf, size_t len,
 | 
			
		|||
 | 
			
		||||
    if( ret < 0 )
 | 
			
		||||
    {
 | 
			
		||||
#if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \
 | 
			
		||||
    !defined(EFI32)
 | 
			
		||||
        if( WSAGetLastError() == WSAEINTR )
 | 
			
		||||
            return( MBEDTLS_ERR_SSL_WANT_READ );
 | 
			
		||||
#else
 | 
			
		||||
        if( errno == EINTR )
 | 
			
		||||
            return( MBEDTLS_ERR_SSL_WANT_READ );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        return( MBEDTLS_ERR_NET_RECV_FAILED );
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -484,13 +591,17 @@ int mbedtls_net_send( void *ctx, const unsigned char *buf, size_t len )
 | 
			
		|||
        if( net_would_block( ctx ) != 0 )
 | 
			
		||||
            return( MBEDTLS_ERR_SSL_WANT_WRITE );
 | 
			
		||||
 | 
			
		||||
        int sock_errno = socket_errno(ctx);
 | 
			
		||||
 | 
			
		||||
        if( sock_errno == EPIPE || sock_errno == ECONNRESET )
 | 
			
		||||
#if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \
 | 
			
		||||
    !defined(EFI32)
 | 
			
		||||
        if( WSAGetLastError() == WSAECONNRESET )
 | 
			
		||||
            return( MBEDTLS_ERR_NET_CONN_RESET );
 | 
			
		||||
#else
 | 
			
		||||
        if( errno == EPIPE || errno == ECONNRESET )
 | 
			
		||||
            return( MBEDTLS_ERR_NET_CONN_RESET );
 | 
			
		||||
 | 
			
		||||
        if( sock_errno == EINTR )
 | 
			
		||||
        if( errno == EINTR )
 | 
			
		||||
            return( MBEDTLS_ERR_SSL_WANT_WRITE );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        return( MBEDTLS_ERR_NET_SEND_FAILED );
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue