fixes from peer review: move OS-specific code from wolfSSL_BIO_read() and wolfSSL_BIO_write() to wolfIO_Recv(), wolfIO_Send(), wolfIO_RecvFrom(), and wolfIO_SendTo(); add SOCKET_ETIMEDOUT definitions to wolfio.h; misc cleanups.

This commit is contained in:
Daniel Pouzzner
2024-06-26 02:04:37 -05:00
parent 0c1163f01f
commit 5298039d09
7 changed files with 86 additions and 39 deletions

View File

@@ -353,14 +353,9 @@ int wolfSSL_BIO_read(WOLFSSL_BIO* bio, void* buf, int len)
* (cannot be used with WOLFSSL_USER_IO) */
bio->flags &= ~WOLFSSL_BIO_FLAG_RETRY;
ret = wolfIO_Recv(bio->num, (char*)buf, len, 0);
if (ret < 0) {
#ifdef USE_WINDOWS_API
if (WSAGetLastError() == WSAEWOULDBLOCK)
bio->flags |= WOLFSSL_BIO_FLAG_RETRY;
#else
if (errno == EAGAIN)
bio->flags |= WOLFSSL_BIO_FLAG_RETRY;
#endif
if (ret == WC_NO_ERR_TRACE(SOCKET_NODATA)) {
bio->flags |= WOLFSSL_BIO_FLAG_RETRY;
ret = WOLFSSL_BIO_ERROR;
}
#else
ret = NOT_COMPILED_IN;
@@ -379,14 +374,9 @@ int wolfSSL_BIO_read(WOLFSSL_BIO* bio, void* buf, int len)
wolfSSL_BIO_ADDR_clear(&bio->peer_addr);
ret = wolfIO_RecvFrom(bio->num, &bio->peer_addr, (char*)buf, len, 0);
}
if ((ret < 0) && (ret != WC_NO_ERR_TRACE(MEMORY_E))) {
#ifdef USE_WINDOWS_API
if (WSAGetLastError() == WSAEWOULDBLOCK)
bio->flags |= WOLFSSL_BIO_FLAG_RETRY;
#else
if (errno == EAGAIN)
bio->flags |= WOLFSSL_BIO_FLAG_RETRY;
#endif
if (ret == WC_NO_ERR_TRACE(SOCKET_NODATA)) {
bio->flags |= WOLFSSL_BIO_FLAG_RETRY;
ret = WOLFSSL_BIO_ERROR;
}
#else
ret = NOT_COMPILED_IN;
@@ -782,13 +772,10 @@ int wolfSSL_BIO_write(WOLFSSL_BIO* bio, const void* data, int len)
* (cannot be used with WOLFSSL_USER_IO) */
bio->flags &= ~WOLFSSL_BIO_FLAG_RETRY;
ret = wolfIO_Send(bio->num, (char*)data, len, 0);
#ifdef USE_WINDOWS_API
if (WSAGetLastError() == WSAEWOULDBLOCK)
if (ret == WC_NO_ERR_TRACE(SOCKET_NODATA)) {
bio->flags |= WOLFSSL_BIO_FLAG_RETRY;
#else
if (errno == EAGAIN)
bio->flags |= WOLFSSL_BIO_FLAG_RETRY;
#endif
ret = WOLFSSL_BIO_ERROR;
}
#else
ret = NOT_COMPILED_IN;
#endif
@@ -806,14 +793,9 @@ int wolfSSL_BIO_write(WOLFSSL_BIO* bio, const void* data, int len)
ret = SOCKET_ERROR_E;
else
ret = wolfIO_SendTo(bio->num, &bio->peer_addr, (char*)data, len, 0);
if (ret < 0) {
#ifdef USE_WINDOWS_API
if (WSAGetLastError() == WSAEWOULDBLOCK)
bio->flags |= WOLFSSL_BIO_FLAG_RETRY;
#else
if (errno == EAGAIN)
bio->flags |= WOLFSSL_BIO_FLAG_RETRY;
#endif
if (ret == WC_NO_ERR_TRACE(SOCKET_NODATA)) {
bio->flags |= WOLFSSL_BIO_FLAG_RETRY;
ret = WOLFSSL_BIO_ERROR;
}
#else
ret = NOT_COMPILED_IN;

View File

@@ -2891,7 +2891,6 @@ int wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
* @return 1 on success.
* @return 0 on failure.
*/
WOLFSSL_API
int wolfSSL_CTX_load_verify_locations_compat(WOLFSSL_CTX* ctx, const char* file,
const char* path)
{

View File

@@ -177,7 +177,7 @@ static WC_INLINE int wolfSSL_LastError(int err)
#elif defined(EBSNET)
return xn_getlasterror();
#elif defined(WOLFSSL_LINUXKM) || defined(WOLFSSL_EMNET)
return err; /* Return provided error value */
return -err; /* Return provided error value */
#elif defined(FUSION_RTOS)
#include <fclerrno.h>
return FCL_GET_ERRNO;
@@ -1100,6 +1100,21 @@ int wolfIO_Recv(SOCKET_T sd, char *buf, int sz, int rdFlags)
recvd = (int)RECV_FUNCTION(sd, buf, (size_t)sz, rdFlags);
recvd = TranslateReturnCode(recvd, (int)sd);
if (recvd < 0) {
int last_err = wolfSSL_LastError(recvd);
if ((last_err == SOCKET_EWOULDBLOCK)
#if SOCKET_EWOULDBLOCK != SOCKET_EAGAIN
|| (last_err == SOCKET_EAGAIN)
#endif
#ifdef SOCKET_ETIMEDOUT
|| (last_err == SOCKET_ETIMEDOUT)
#endif
)
{
return SOCKET_NODATA;
}
}
return recvd;
}
@@ -1110,6 +1125,21 @@ int wolfIO_Send(SOCKET_T sd, char *buf, int sz, int wrFlags)
sent = (int)SEND_FUNCTION(sd, buf, (size_t)sz, wrFlags);
sent = TranslateReturnCode(sent, (int)sd);
if (sent < 0) {
int last_err = wolfSSL_LastError(sent);
if ((last_err == SOCKET_EWOULDBLOCK)
#if SOCKET_EWOULDBLOCK != SOCKET_EAGAIN
|| (last_err == SOCKET_EAGAIN)
#endif
#ifdef SOCKET_ETIMEDOUT
|| (last_err == SOCKET_ETIMEDOUT)
#endif
)
{
return SOCKET_NODATA;
}
}
return sent;
}
@@ -1120,9 +1150,26 @@ int wolfIO_RecvFrom(SOCKET_T sd, WOLFSSL_BIO_ADDR *addr, char *buf, int sz, int
int recvd;
socklen_t addr_len = (socklen_t)sizeof(*addr);
recvd = (int)DTLS_RECVFROM_FUNCTION(sd, buf, (size_t)sz, rdFlags, addr ? &addr->sa : NULL, addr ? &addr_len : 0);
recvd = (int)DTLS_RECVFROM_FUNCTION(sd, buf, (size_t)sz, rdFlags,
addr ? &addr->sa : NULL,
addr ? &addr_len : 0);
recvd = TranslateReturnCode(recvd, (int)sd);
if (recvd < 0) {
int last_err = wolfSSL_LastError(recvd);
if ((last_err == SOCKET_EWOULDBLOCK)
#if SOCKET_EWOULDBLOCK != SOCKET_EAGAIN
|| (last_err == SOCKET_EAGAIN)
#endif
#ifdef SOCKET_ETIMEDOUT
|| (last_err == SOCKET_ETIMEDOUT)
#endif
)
{
return SOCKET_NODATA;
}
}
return recvd;
}
@@ -1130,9 +1177,26 @@ int wolfIO_SendTo(SOCKET_T sd, WOLFSSL_BIO_ADDR *addr, char *buf, int sz, int wr
{
int sent;
sent = (int)DTLS_SENDTO_FUNCTION(sd, buf, (size_t)sz, wrFlags, addr ? &addr->sa : NULL, addr ? wolfSSL_BIO_ADDR_size(addr) : 0);
sent = (int)DTLS_SENDTO_FUNCTION(sd, buf, (size_t)sz, wrFlags,
addr ? &addr->sa : NULL,
addr ? wolfSSL_BIO_ADDR_size(addr) : 0);
sent = TranslateReturnCode(sent, (int)sd);
if (sent < 0) {
int last_err = wolfSSL_LastError(sent);
if ((last_err == SOCKET_EWOULDBLOCK)
#if SOCKET_EWOULDBLOCK != SOCKET_EAGAIN
|| (last_err == SOCKET_EAGAIN)
#endif
#ifdef SOCKET_ETIMEDOUT
|| (last_err == SOCKET_ETIMEDOUT)
#endif
)
{
return SOCKET_NODATA;
}
}
return sent;
}

View File

@@ -56986,9 +56986,7 @@ static int test_wolfSSL_BIO_datagram(void)
static const struct timeval timeout = { 0, 250000 };
#endif
#ifdef USE_WINDOWS_API
WSAStartup();
#endif
StartTCP();
if (EXPECT_SUCCESS()) {
fd1 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

View File

@@ -13775,7 +13775,7 @@ static int GetRDN(DecodedCert* cert, char* full, word32* idx, int* nid,
* @param [in, out] cert Decoded certificate object.
* @param [out] full Buffer to hold full name as a string.
* @param [out] hash Buffer to hold hash of name.
* @param [in] nameType ISSUER or SUBJECT.
* @param [in] nameType ASN_ISSUER or ASN_SUBJECT.
* @param [in] input Buffer holding certificate name.
* @param [in, out] inOutIdx On in, start of certificate name.
* On out, start of ASN.1 item after cert name.

View File

@@ -185,8 +185,8 @@ enum wolfSSL_ErrorCodes {
DTLS_CID_ERROR = -454, /* Wrong or missing CID */
DTLS_TOO_MANY_FRAGMENTS_E = -455, /* Received too many fragments */
QUIC_WRONG_ENC_LEVEL = -456, /* QUIC data received on wrong encryption level */
DUPLICATE_TLS_EXT_E = -457, /* Duplicate TLS extension in msg. */
SOCKET_NOT_CONNECTED_E = -458, /* Socket has no associated peer. */
/* add strings to wolfSSL_ERR_reason_error_string in internal.c !!!!! */
/* begin negotiation parameter errors */

View File

@@ -208,6 +208,7 @@
#endif
#define SOCKET_EWOULDBLOCK WSAEWOULDBLOCK
#define SOCKET_EAGAIN WSAETIMEDOUT
#define SOCKET_ETIMEDOUT WSAETIMEDOUT
#define SOCKET_ECONNRESET WSAECONNRESET
#define SOCKET_EINTR WSAEINTR
#define SOCKET_EPIPE WSAEPIPE
@@ -312,6 +313,7 @@
#elif defined(WOLFSSL_LWIP_NATIVE)
#define SOCKET_EWOULDBLOCK ERR_WOULDBLOCK
#define SOCKET_EAGAIN ERR_WOULDBLOCK
#define SOCKET_TIMEDOUT ERR_TIMEOUT
#define SOCKET_ECONNRESET ERR_RST
#define SOCKET_EINTR ERR_CLSD
#define SOCKET_EPIPE ERR_CLSD
@@ -329,6 +331,7 @@
#else
#define SOCKET_EWOULDBLOCK EWOULDBLOCK
#define SOCKET_EAGAIN EAGAIN
#define SOCKET_ETIMEDOUT ETIMEDOUT
#define SOCKET_ECONNRESET ECONNRESET
#define SOCKET_EINTR EINTR
#define SOCKET_EPIPE EPIPE
@@ -514,6 +517,7 @@ WOLFSSL_API int wolfIO_RecvFrom(SOCKET_T sd, WOLFSSL_BIO_ADDR *addr, char *buf,
FNS_CLOSE(s, &err); \
} while(0)
#endif
#define StartTCP() WC_DO_NOTHING
#else
#ifndef CloseSocket
#define CloseSocket(s) close(s)