Add error handling on Socket_t in transport layer. (#887)

* Set tcpSocket to SOCKETS_INVALID_SOCKET when any error occurred in TLS_FreeRTOS_Connect.

* Initialize Socket_t to NULL.
pull/894/head
ActoryOu 2 years ago committed by GitHub
parent e9bfcb8a08
commit e85b49ad18
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -25,7 +25,7 @@
*/ */
/** /**
* @file sockets_wrapper.h * @file tcp_sockets_wrapper.h
* @brief TCP transport functions wrapper. * @brief TCP transport functions wrapper.
*/ */

@ -170,6 +170,7 @@ BaseType_t TCP_Sockets_Connect( Socket_t * pTcpSocket,
if( tcpSocket != FREERTOS_INVALID_SOCKET ) if( tcpSocket != FREERTOS_INVALID_SOCKET )
{ {
( void ) FreeRTOS_closesocket( tcpSocket ); ( void ) FreeRTOS_closesocket( tcpSocket );
tcpSocket = FREERTOS_INVALID_SOCKET;
} }
} }
else else
@ -192,7 +193,7 @@ void TCP_Sockets_Disconnect( Socket_t tcpSocket )
BaseType_t waitForShutdownLoopCount = 0; BaseType_t waitForShutdownLoopCount = 0;
uint8_t pDummyBuffer[ 2 ]; uint8_t pDummyBuffer[ 2 ];
if( tcpSocket != FREERTOS_INVALID_SOCKET ) if( ( tcpSocket != NULL ) && ( tcpSocket != FREERTOS_INVALID_SOCKET ) )
{ {
/* Initiate graceful shutdown. */ /* Initiate graceful shutdown. */
( void ) FreeRTOS_shutdown( tcpSocket, FREERTOS_SHUT_RDWR ); ( void ) FreeRTOS_shutdown( tcpSocket, FREERTOS_SHUT_RDWR );

@ -633,6 +633,7 @@ TlsTransportStatus_t TLS_FreeRTOS_Connect( NetworkContext_t * pNetworkContext,
TlsTransportParams_t * pTlsTransportParams = NULL; TlsTransportParams_t * pTlsTransportParams = NULL;
TlsTransportStatus_t returnStatus = TLS_TRANSPORT_SUCCESS; TlsTransportStatus_t returnStatus = TLS_TRANSPORT_SUCCESS;
BaseType_t socketStatus = 0; BaseType_t socketStatus = 0;
BaseType_t isSocketConnected = pdFALSE, isTlsSetup = pdFALSE;
if( ( pNetworkContext == NULL ) || if( ( pNetworkContext == NULL ) ||
( pNetworkContext->pParams == NULL ) || ( pNetworkContext->pParams == NULL ) ||
@ -660,6 +661,10 @@ TlsTransportStatus_t TLS_FreeRTOS_Connect( NetworkContext_t * pNetworkContext,
if( returnStatus == TLS_TRANSPORT_SUCCESS ) if( returnStatus == TLS_TRANSPORT_SUCCESS )
{ {
pTlsTransportParams = pNetworkContext->pParams; pTlsTransportParams = pNetworkContext->pParams;
/* Initialize tcpSocket. */
pTlsTransportParams->tcpSocket = NULL;
socketStatus = TCP_Sockets_Connect( &( pTlsTransportParams->tcpSocket ), socketStatus = TCP_Sockets_Connect( &( pTlsTransportParams->tcpSocket ),
pHostName, pHostName,
port, port,
@ -678,6 +683,8 @@ TlsTransportStatus_t TLS_FreeRTOS_Connect( NetworkContext_t * pNetworkContext,
/* Initialize mbedtls. */ /* Initialize mbedtls. */
if( returnStatus == TLS_TRANSPORT_SUCCESS ) if( returnStatus == TLS_TRANSPORT_SUCCESS )
{ {
isSocketConnected = pdTRUE;
returnStatus = initMbedtls( &( pTlsTransportParams->sslContext.entropyContext ), returnStatus = initMbedtls( &( pTlsTransportParams->sslContext.entropyContext ),
&( pTlsTransportParams->sslContext.ctrDrgbContext ) ); &( pTlsTransportParams->sslContext.ctrDrgbContext ) );
} }
@ -691,17 +698,25 @@ TlsTransportStatus_t TLS_FreeRTOS_Connect( NetworkContext_t * pNetworkContext,
/* Perform TLS handshake. */ /* Perform TLS handshake. */
if( returnStatus == TLS_TRANSPORT_SUCCESS ) if( returnStatus == TLS_TRANSPORT_SUCCESS )
{ {
isTlsSetup = pdTRUE;
returnStatus = tlsHandshake( pNetworkContext, pNetworkCredentials ); returnStatus = tlsHandshake( pNetworkContext, pNetworkCredentials );
} }
/* Clean up on failure. */ /* Clean up on failure. */
if( returnStatus != TLS_TRANSPORT_SUCCESS ) if( returnStatus != TLS_TRANSPORT_SUCCESS )
{ {
if( ( pNetworkContext != NULL ) && ( pNetworkContext->pParams != NULL ) ) /* Free SSL context if it's setup. */
if( isTlsSetup == pdTRUE )
{ {
sslContextFree( &( pTlsTransportParams->sslContext ) ); sslContextFree( &( pTlsTransportParams->sslContext ) );
}
/* Call Sockets_Disconnect if socket was connected. */
if( isSocketConnected == pdTRUE )
{
TCP_Sockets_Disconnect( pTlsTransportParams->tcpSocket ); TCP_Sockets_Disconnect( pTlsTransportParams->tcpSocket );
pTlsTransportParams->tcpSocket = NULL;
} }
} }
else else

@ -669,6 +669,7 @@ TlsTransportStatus_t TLS_FreeRTOS_Connect( NetworkContext_t * pNetworkContext,
TlsTransportParams_t * pTlsTransportParams = NULL; TlsTransportParams_t * pTlsTransportParams = NULL;
TlsTransportStatus_t returnStatus = TLS_TRANSPORT_SUCCESS; TlsTransportStatus_t returnStatus = TLS_TRANSPORT_SUCCESS;
BaseType_t socketStatus = 0; BaseType_t socketStatus = 0;
BaseType_t isSocketConnected = pdFALSE;
if( ( pNetworkContext == NULL ) || if( ( pNetworkContext == NULL ) ||
( pNetworkContext->pParams == NULL ) || ( pNetworkContext->pParams == NULL ) ||
@ -696,6 +697,10 @@ TlsTransportStatus_t TLS_FreeRTOS_Connect( NetworkContext_t * pNetworkContext,
if( returnStatus == TLS_TRANSPORT_SUCCESS ) if( returnStatus == TLS_TRANSPORT_SUCCESS )
{ {
pTlsTransportParams = pNetworkContext->pParams; pTlsTransportParams = pNetworkContext->pParams;
/* Initialize tcpSocket. */
pTlsTransportParams->tcpSocket = NULL;
socketStatus = TCP_Sockets_Connect( &( pTlsTransportParams->tcpSocket ), socketStatus = TCP_Sockets_Connect( &( pTlsTransportParams->tcpSocket ),
pHostName, pHostName,
port, port,
@ -714,13 +719,19 @@ TlsTransportStatus_t TLS_FreeRTOS_Connect( NetworkContext_t * pNetworkContext,
/* Perform TLS handshake. */ /* Perform TLS handshake. */
if( returnStatus == TLS_TRANSPORT_SUCCESS ) if( returnStatus == TLS_TRANSPORT_SUCCESS )
{ {
isSocketConnected = pdTRUE;
returnStatus = tlsSetup( pNetworkContext, pHostName, pNetworkCredentials ); returnStatus = tlsSetup( pNetworkContext, pHostName, pNetworkCredentials );
} }
/* Clean up on failure. */ /* Clean up on failure. */
if( returnStatus != TLS_TRANSPORT_SUCCESS ) if( returnStatus != TLS_TRANSPORT_SUCCESS )
{
if( isSocketConnected == pdTRUE )
{ {
TCP_Sockets_Disconnect( pTlsTransportParams->tcpSocket ); TCP_Sockets_Disconnect( pTlsTransportParams->tcpSocket );
pTlsTransportParams->tcpSocket = NULL;
}
} }
else else
{ {

@ -71,6 +71,10 @@ PlaintextTransportStatus_t Plaintext_FreeRTOS_Connect( NetworkContext_t * pNetwo
else else
{ {
pPlaintextTransportParams = pNetworkContext->pParams; pPlaintextTransportParams = pNetworkContext->pParams;
/* Initialize tcpSocket. */
pPlaintextTransportParams->tcpSocket = NULL;
/* Establish a TCP connection with the server. */ /* Establish a TCP connection with the server. */
socketStatus = TCP_Sockets_Connect( &( pPlaintextTransportParams->tcpSocket ), socketStatus = TCP_Sockets_Connect( &( pPlaintextTransportParams->tcpSocket ),
pHostName, pHostName,

@ -380,7 +380,7 @@ TlsTransportStatus_t TLS_FreeRTOS_Connect( NetworkContext_t * pNetworkContext,
{ {
TlsTransportStatus_t returnStatus = TLS_TRANSPORT_SUCCESS; TlsTransportStatus_t returnStatus = TLS_TRANSPORT_SUCCESS;
BaseType_t socketStatus = 0; BaseType_t socketStatus = 0;
BaseType_t isSocketConnected = pdFALSE;
if( ( pNetworkContext == NULL ) || if( ( pNetworkContext == NULL ) ||
( pHostName == NULL ) || ( pHostName == NULL ) ||
@ -402,6 +402,8 @@ TlsTransportStatus_t TLS_FreeRTOS_Connect( NetworkContext_t * pNetworkContext,
/* Establish a TCP connection with the server. */ /* Establish a TCP connection with the server. */
if( returnStatus == TLS_TRANSPORT_SUCCESS ) if( returnStatus == TLS_TRANSPORT_SUCCESS )
{ {
pNetworkContext->tcpSocket = NULL;
socketStatus = TCP_Sockets_Connect( &( pNetworkContext->tcpSocket ), socketStatus = TCP_Sockets_Connect( &( pNetworkContext->tcpSocket ),
pHostName, pHostName,
port, port,
@ -420,6 +422,8 @@ TlsTransportStatus_t TLS_FreeRTOS_Connect( NetworkContext_t * pNetworkContext,
/* Initialize tls. */ /* Initialize tls. */
if( returnStatus == TLS_TRANSPORT_SUCCESS ) if( returnStatus == TLS_TRANSPORT_SUCCESS )
{ {
isSocketConnected = pdTRUE;
returnStatus = initTLS(); returnStatus = initTLS();
} }
@ -431,8 +435,12 @@ TlsTransportStatus_t TLS_FreeRTOS_Connect( NetworkContext_t * pNetworkContext,
/* Clean up on failure. */ /* Clean up on failure. */
if( returnStatus != TLS_TRANSPORT_SUCCESS ) if( returnStatus != TLS_TRANSPORT_SUCCESS )
{
if( isSocketConnected == pdTRUE )
{ {
TCP_Sockets_Disconnect( pNetworkContext->tcpSocket ); TCP_Sockets_Disconnect( pNetworkContext->tcpSocket );
pNetworkContext->tcpSocket = NULL;
}
} }
else else
{ {

Loading…
Cancel
Save