diff --git a/examples/server/server.c b/examples/server/server.c index 6bc75d43a..ae6e19ce4 100644 --- a/examples/server/server.c +++ b/examples/server/server.c @@ -3360,6 +3360,7 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args) } while (err == WC_PENDING_E); } #else + (void)nonBlocking; ret = NonBlockingSSL_Accept(ssl); #endif #ifdef WOLFSSL_EARLY_DATA diff --git a/src/internal.c b/src/internal.c index ce14ba9ea..ae7c9bf93 100644 --- a/src/internal.c +++ b/src/internal.c @@ -9637,8 +9637,10 @@ static int SendHandshakeMsg(WOLFSSL* ssl, byte* input, word32 inputSz, AddPacketName(ssl, packetName); } if (ssl->toInfoOn) { - AddPacketInfo(ssl, packetName, handshake, + ret = AddPacketInfo(ssl, packetName, handshake, output, outputSz, WRITE_PROTO, 0, ssl->heap); + if (ret != 0) + return ret; } #endif ssl->fragOffset += fragSz; @@ -15473,9 +15475,11 @@ static int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx, /* add name later, add the handshake header part back on and record layer * header */ if (ssl->toInfoOn) { - AddPacketInfo(ssl, 0, handshake, input + *inOutIdx - + ret = AddPacketInfo(ssl, 0, handshake, input + *inOutIdx - HANDSHAKE_HEADER_SZ, size + HANDSHAKE_HEADER_SZ, READ_PROTO, RECORD_HEADER_SZ, ssl->heap); + if (ret != 0) + return ret; #ifdef WOLFSSL_CALLBACKS AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo); #endif @@ -18556,8 +18560,10 @@ static int DoAlert(WOLFSSL* ssl, byte* input, word32* inOutIdx, int* type) AddPacketName(ssl, "Alert"); if (ssl->toInfoOn) { /* add record header back on to info + alert bytes level/code */ - AddPacketInfo(ssl, "Alert", alert, input + *inOutIdx, ALERT_SIZE, - READ_PROTO, RECORD_HEADER_SZ, ssl->heap); + int ret = AddPacketInfo(ssl, "Alert", alert, input + *inOutIdx, + ALERT_SIZE, READ_PROTO, RECORD_HEADER_SZ, ssl->heap); + if (ret != 0) + return ret; #ifdef WOLFSSL_CALLBACKS AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo); #endif @@ -19678,11 +19684,13 @@ int ProcessReplyEx(WOLFSSL* ssl, int allowSocketErr) AddPacketName(ssl, "ChangeCipher"); /* add record header back on info */ if (ssl->toInfoOn) { - AddPacketInfo(ssl, "ChangeCipher", + ret = AddPacketInfo(ssl, "ChangeCipher", change_cipher_spec, ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx, 1, READ_PROTO, RECORD_HEADER_SZ, ssl->heap); + if (ret != 0) + return ret; #ifdef WOLFSSL_CALLBACKS AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo); #endif @@ -20073,9 +20081,12 @@ int SendChangeCipher(WOLFSSL* ssl) #endif #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ssl->hsInfoOn) AddPacketName(ssl, "ChangeCipher"); - if (ssl->toInfoOn) - AddPacketInfo(ssl, "ChangeCipher", change_cipher_spec, output, + if (ssl->toInfoOn) { + ret = AddPacketInfo(ssl, "ChangeCipher", change_cipher_spec, output, sendSz, WRITE_PROTO, 0, ssl->heap); + if (ret != 0) + return ret; + } #endif ssl->buffers.outputBuffer.length += sendSz; @@ -21024,9 +21035,12 @@ int SendFinished(WOLFSSL* ssl) #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ssl->hsInfoOn) AddPacketName(ssl, "Finished"); - if (ssl->toInfoOn) - AddPacketInfo(ssl, "Finished", handshake, output, sendSz, + if (ssl->toInfoOn) { + ret = AddPacketInfo(ssl, "Finished", handshake, output, sendSz, WRITE_PROTO, 0, ssl->heap); + if (ret != 0) + return ret; + } #endif ssl->buffers.outputBuffer.length += sendSz; @@ -21466,9 +21480,12 @@ int SendCertificate(WOLFSSL* ssl) #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ssl->hsInfoOn) AddPacketName(ssl, "Certificate"); - if (ssl->toInfoOn) - AddPacketInfo(ssl, "Certificate", handshake, output, sendSz, + if (ssl->toInfoOn) { + ret = AddPacketInfo(ssl, "Certificate", handshake, output, sendSz, WRITE_PROTO, 0, ssl->heap); + if (ret != 0) + return ret; + } #endif ssl->buffers.outputBuffer.length += sendSz; @@ -21662,9 +21679,12 @@ int SendCertificateRequest(WOLFSSL* ssl) #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ssl->hsInfoOn) AddPacketName(ssl, "CertificateRequest"); - if (ssl->toInfoOn) - AddPacketInfo(ssl, "CertificateRequest", handshake, output, sendSz, - WRITE_PROTO, 0, ssl->heap); + if (ssl->toInfoOn) { + ret = AddPacketInfo(ssl, "CertificateRequest", handshake, output, + sendSz, WRITE_PROTO, 0, ssl->heap); + if (ret != 0) + return ret; + } #endif ssl->buffers.outputBuffer.length += sendSz; if (ssl->options.groupMessages) @@ -21776,9 +21796,12 @@ static int BuildCertificateStatus(WOLFSSL* ssl, byte type, buffer* status, #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ret == 0 && ssl->hsInfoOn) AddPacketName(ssl, "CertificateStatus"); - if (ret == 0 && ssl->toInfoOn) - AddPacketInfo(ssl, "CertificateStatus", handshake, output, sendSz, - WRITE_PROTO, 0, ssl->heap); + if (ret == 0 && ssl->toInfoOn) { + ret = AddPacketInfo(ssl, "CertificateStatus", handshake, output, + sendSz, WRITE_PROTO, 0, ssl->heap); + if (ret != 0) + return ret; + } #endif if (ret == 0) { @@ -22703,9 +22726,12 @@ static int SendAlert_ex(WOLFSSL* ssl, int severity, int type) #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ssl->hsInfoOn) AddPacketName(ssl, "Alert"); - if (ssl->toInfoOn) - AddPacketInfo(ssl, "Alert", alert, output, sendSz, WRITE_PROTO, 0, - ssl->heap); + if (ssl->toInfoOn) { + ret = AddPacketInfo(ssl, "Alert", alert, output, sendSz, + WRITE_PROTO, 0, ssl->heap); + if (ret != 0) + return ret; + } #endif ssl->buffers.outputBuffer.length += sendSz; @@ -25173,7 +25199,7 @@ int PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, word32 hashSigAlgoSz) * written 1 if this packet is being written to wire, 0 if being read * heap custom heap to use for mallocs/frees */ - void AddPacketInfo(WOLFSSL* ssl, const char* name, int type, + int AddPacketInfo(WOLFSSL* ssl, const char* name, int type, const byte* data, int sz, int written, int lateRL, void* heap) { #ifdef WOLFSSL_CALLBACKS @@ -25213,7 +25239,10 @@ int PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, word32 hashSigAlgoSz) lateRL, data, sz); } } - gettimeofday(&currTime, 0); + + if (gettimeofday(&currTime, 0) < 0) + return SYSLIB_FAILED_E; + info->packets[info->numberPackets].timestamp.tv_sec = currTime.tv_sec; info->packets[info->numberPackets].timestamp.tv_usec = @@ -25242,6 +25271,8 @@ int PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, word32 hashSigAlgoSz) (void)type; (void)ssl; (void)lateRL; + + return 0; } #endif /* WOLFSSL_CALLBACKS */ @@ -26140,9 +26171,12 @@ static int HashSkeData(WOLFSSL* ssl, enum wc_HashType hashType, #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello"); - if (ssl->toInfoOn) - AddPacketInfo(ssl, "ClientHello", handshake, output, sendSz, + if (ssl->toInfoOn) { + ret = AddPacketInfo(ssl, "ClientHello", handshake, output, sendSz, WRITE_PROTO, 0, ssl->heap); + if (ret != 0) + return ret; + } #endif ssl->options.buildingMsg = 0; @@ -29506,9 +29540,13 @@ int SendClientKeyExchange(WOLFSSL* ssl) #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ssl->hsInfoOn) AddPacketName(ssl, "ClientKeyExchange"); - if (ssl->toInfoOn) - AddPacketInfo(ssl, "ClientKeyExchange", handshake, + if (ssl->toInfoOn) { + ret = AddPacketInfo(ssl, "ClientKeyExchange", handshake, args->output, args->sendSz, WRITE_PROTO, 0, ssl->heap); + if (ret != 0) { + goto exit_scke; + } + } #endif ssl->buffers.outputBuffer.length += args->sendSz; @@ -30537,9 +30575,12 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ssl->hsInfoOn) AddPacketName(ssl, "ServerHello"); - if (ssl->toInfoOn) - AddPacketInfo(ssl, "ServerHello", handshake, output, sendSz, + if (ssl->toInfoOn) { + ret = AddPacketInfo(ssl, "ServerHello", handshake, output, sendSz, WRITE_PROTO, 0, ssl->heap); + if (ret != 0) + return ret; + } #endif ssl->options.serverState = SERVER_HELLO_COMPLETE; @@ -33956,9 +33997,12 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ssl->hsInfoOn) AddPacketName(ssl, "ServerHelloDone"); - if (ssl->toInfoOn) - AddPacketInfo(ssl, "ServerHelloDone", handshake, output, sendSz, - WRITE_PROTO, 0, ssl->heap); + if (ssl->toInfoOn) { + ret = AddPacketInfo(ssl, "ServerHelloDone", handshake, output, + sendSz, WRITE_PROTO, 0, ssl->heap); + if (ret != 0) + return ret; + } #endif ssl->options.serverState = SERVER_HELLODONE_COMPLETE; ssl->options.buildingMsg = 0; @@ -35078,9 +35122,12 @@ static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ], #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ssl->hsInfoOn) AddPacketName(ssl, "HelloVerifyRequest"); - if (ssl->toInfoOn) - AddPacketInfo(ssl, "HelloVerifyRequest", handshake, output, + if (ssl->toInfoOn) { + ret = AddPacketInfo(ssl, "HelloVerifyRequest", handshake, output, sendSz, WRITE_PROTO, 0, ssl->heap); + if (ret != 0) + return ret; + } #endif /* are we in scr */ diff --git a/src/ssl.c b/src/ssl.c index 2ba19ff7e..9771cac1b 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -15201,29 +15201,29 @@ int wolfSSL_set_compression(WOLFSSL* ssl) #define AddTimes(a, b, c) \ do { \ - c.tv_sec = a.tv_sec + b.tv_sec; \ - c.tv_usec = a.tv_usec + b.tv_usec; \ - if (c.tv_usec >= 1000000) { \ - c.tv_sec++; \ - c.tv_usec -= 1000000; \ + (c).tv_sec = (a).tv_sec + (b).tv_sec; \ + (c).tv_usec = (a).tv_usec + (b).tv_usec;\ + if ((c).tv_usec >= 1000000) { \ + (c).tv_sec++; \ + (c).tv_usec -= 1000000; \ } \ } while (0) #define SubtractTimes(a, b, c) \ do { \ - c.tv_sec = a.tv_sec - b.tv_sec; \ - c.tv_usec = a.tv_usec - b.tv_usec; \ - if (c.tv_usec < 0) { \ - c.tv_sec--; \ - c.tv_usec += 1000000; \ + (c).tv_sec = (a).tv_sec - (b).tv_sec; \ + (c).tv_usec = (a).tv_usec - (b).tv_usec;\ + if ((c).tv_usec < 0) { \ + (c).tv_sec--; \ + (c).tv_usec += 1000000; \ } \ } while (0) #define CmpTimes(a, b, cmp) \ - ((a.tv_sec == b.tv_sec) ? \ - (a.tv_usec cmp b.tv_usec) : \ - (a.tv_sec cmp b.tv_sec)) \ + (((a).tv_sec == (b).tv_sec) ? \ + ((a).tv_usec cmp (b).tv_usec) : \ + ((a).tv_sec cmp (b).tv_sec)) \ /* do nothing handler */ @@ -15306,7 +15306,8 @@ int wolfSSL_set_compression(WOLFSSL* ssl) /* do callbacks */ if (toCb) { if (oldTimerOn) { - gettimeofday(&endTime, 0); + if (gettimeofday(&endTime, 0) < 0) + ERR_OUT(SYSLIB_FAILED_E); SubtractTimes(endTime, startTime, totalTime); /* adjust old timer for elapsed time */ if (CmpTimes(totalTime, oldTimeout.it_value, <)) diff --git a/src/tls13.c b/src/tls13.c index d1ca5e410..b18df6d19 100644 --- a/src/tls13.c +++ b/src/tls13.c @@ -3989,8 +3989,10 @@ int SendTls13ClientHello(WOLFSSL* ssl) #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello"); if (ssl->toInfoOn) { - AddPacketInfo(ssl, "ClientHello", handshake, args->output, args->sendSz, - WRITE_PROTO, 0, ssl->heap); + ret = AddPacketInfo(ssl, "ClientHello", handshake, args->output, + args->sendSz, WRITE_PROTO, 0, ssl->heap); + if (ret != 0) + return ret; } #endif @@ -6217,8 +6219,10 @@ int SendTls13ServerHello(WOLFSSL* ssl, byte extMsgType) if (ssl->hsInfoOn) AddPacketName(ssl, "ServerHello"); if (ssl->toInfoOn) { - AddPacketInfo(ssl, "ServerHello", handshake, output, sendSz, + ret = AddPacketInfo(ssl, "ServerHello", handshake, output, sendSz, WRITE_PROTO, 0, ssl->heap); + if (ret != 0) + return ret; } #endif @@ -6361,8 +6365,10 @@ static int SendTls13EncryptedExtensions(WOLFSSL* ssl) if (ssl->hsInfoOn) AddPacketName(ssl, "EncryptedExtensions"); if (ssl->toInfoOn) { - AddPacketInfo(ssl, "EncryptedExtensions", handshake, output, + ret = AddPacketInfo(ssl, "EncryptedExtensions", handshake, output, sendSz, WRITE_PROTO, 0, ssl->heap); + if (ret != 0) + return ret; } #endif @@ -6502,8 +6508,10 @@ static int SendTls13CertificateRequest(WOLFSSL* ssl, byte* reqCtx, if (ssl->hsInfoOn) AddPacketName(ssl, "CertificateRequest"); if (ssl->toInfoOn) { - AddPacketInfo(ssl, "CertificateRequest", handshake, output, + ret = AddPacketInfo(ssl, "CertificateRequest", handshake, output, sendSz, WRITE_PROTO, 0, ssl->heap); + if (ret != 0) + return ret; } #endif @@ -7309,8 +7317,10 @@ static int SendTls13Certificate(WOLFSSL* ssl) if (ssl->hsInfoOn) AddPacketName(ssl, "Certificate"); if (ssl->toInfoOn) { - AddPacketInfo(ssl, "Certificate", handshake, output, + ret = AddPacketInfo(ssl, "Certificate", handshake, output, sendSz, WRITE_PROTO, 0, ssl->heap); + if (ret != 0) + return ret; } #endif @@ -7857,9 +7867,11 @@ static int SendTls13CertificateVerify(WOLFSSL* ssl) if (ssl->hsInfoOn) AddPacketName(ssl, "CertificateVerify"); if (ssl->toInfoOn) { - AddPacketInfo(ssl, "CertificateVerify", handshake, + ret = AddPacketInfo(ssl, "CertificateVerify", handshake, args->output, args->sendSz, WRITE_PROTO, 0, ssl->heap); + if (ret != 0) + goto exit_scv; } #endif @@ -8778,8 +8790,10 @@ static int SendTls13Finished(WOLFSSL* ssl) #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ssl->hsInfoOn) AddPacketName(ssl, "Finished"); if (ssl->toInfoOn) { - AddPacketInfo(ssl, "Finished", handshake, output, sendSz, + ret = AddPacketInfo(ssl, "Finished", handshake, output, sendSz, WRITE_PROTO, 0, ssl->heap); + if (ret != 0) + return ret; } #endif @@ -8987,8 +9001,10 @@ static int SendTls13KeyUpdate(WOLFSSL* ssl) #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ssl->hsInfoOn) AddPacketName(ssl, "KeyUpdate"); if (ssl->toInfoOn) { - AddPacketInfo(ssl, "KeyUpdate", handshake, output, sendSz, + ret = AddPacketInfo(ssl, "KeyUpdate", handshake, output, sendSz, WRITE_PROTO, 0, ssl->heap); + if (ret != 0) + return ret; } #endif @@ -10168,9 +10184,11 @@ int DoTls13HandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx, #if defined(WOLFSSL_CALLBACKS) /* add name later, add on record and handshake header part back on */ if (ssl->toInfoOn) { - AddPacketInfo(ssl, 0, handshake, input + *inOutIdx - + ret = AddPacketInfo(ssl, 0, handshake, input + *inOutIdx - HANDSHAKE_HEADER_SZ, size + HANDSHAKE_HEADER_SZ, READ_PROTO, RECORD_HEADER_SZ, ssl->heap); + if (ret != 0) + return ret; AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo); } #endif diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 0c039909d..c2858b62c 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -2072,8 +2072,8 @@ enum { #error Invalid static buffer length #endif #elif defined(LARGE_STATIC_BUFFERS) - #define STATIC_BUFFER_LEN RECORD_HEADER_SZ + RECORD_SIZE + COMP_EXTRA + \ - MTU_EXTRA + MAX_MSG_EXTRA + #define STATIC_BUFFER_LEN (RECORD_HEADER_SZ + RECORD_SIZE + COMP_EXTRA + \ + MTU_EXTRA + MAX_MSG_EXTRA) #else /* don't fragment memory from the record header */ #define STATIC_BUFFER_LEN RECORD_HEADER_SZ @@ -5311,7 +5311,7 @@ WOLFSSL_API void SSL_ResourceFree(WOLFSSL* ssl); /* Micrium uses */ WOLFSSL_LOCAL void InitTimeoutInfo(TimeoutInfo* info); WOLFSSL_LOCAL void FreeTimeoutInfo(TimeoutInfo* info, void* heap); - WOLFSSL_LOCAL void AddPacketInfo(WOLFSSL* ssl, const char* name, int type, + WOLFSSL_LOCAL int AddPacketInfo(WOLFSSL* ssl, const char* name, int type, const byte* data, int sz, int written, int lateRL, void* heap); WOLFSSL_LOCAL void AddLateName(const char* name, TimeoutInfo* info); diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index 66127b14d..4c449370f 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -4104,10 +4104,10 @@ typedef int (*TimeoutCallBack)(TimeoutInfo*); /* wolfSSL connect extension allowing HandShakeCallBack and/or TimeoutCallBack for diagnostics */ -WOLFSSL_API int wolfSSL_connect_ex(WOLFSSL* ssl, HandShakeCallBack, TimeoutCallBack, - WOLFSSL_TIMEVAL); -WOLFSSL_API int wolfSSL_accept_ex(WOLFSSL* ssl, HandShakeCallBack, TimeoutCallBack, - WOLFSSL_TIMEVAL); +WOLFSSL_API int wolfSSL_connect_ex(WOLFSSL* ssl, HandShakeCallBack hsCb, + TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout); +WOLFSSL_API int wolfSSL_accept_ex(WOLFSSL* ssl, HandShakeCallBack hsCb, + TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout); #endif /* WOLFSSL_CALLBACKS */