diff --git a/src/ssl.c b/src/ssl.c index 27a2b5f8e..d6d38583e 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -14220,6 +14220,94 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) #endif } + + unsigned long wolfSSL_ERR_get_error_line(const char** file, int* line) + { + #ifdef DEBUG_WOLFSSL + if (file != NULL) { + *file = (const char*)wc_last_error_file; + } + + if (line != NULL) { + *line = (int)wc_last_error_line; + + } + + return wc_last_error; + #else + (void)file; + (void)line; + + return 0; + #endif + } + + +#ifdef DEBUG_WOLFSSL + static const char WOLFSSL_SYS_ACCEPT_T[] = "accept"; + static const char WOLFSSL_SYS_BIND_T[] = "bind"; + static const char WOLFSSL_SYS_CONNECT_T[] = "connect"; + static const char WOLFSSL_SYS_FOPEN_T[] = "fopen"; + static const char WOLFSSL_SYS_FREAD_T[] = "fread"; + static const char WOLFSSL_SYS_GETADDRINFO_T[] = "getaddrinfo"; + static const char WOLFSSL_SYS_GETSOCKOPT_T[] = "getsockopt"; + static const char WOLFSSL_SYS_GETSOCKNAME_T[] = "getsockname"; + static const char WOLFSSL_SYS_GETHOSTBYNAME_T[] = "gethostbyname"; + static const char WOLFSSL_SYS_GETNAMEINFO_T[] = "getnameinfo"; + static const char WOLFSSL_SYS_GETSERVBYNAME_T[] = "getservbyname"; + static const char WOLFSSL_SYS_IOCTLSOCKET_T[] = "ioctlsocket"; + static const char WOLFSSL_SYS_LISTEN_T[] = "listen"; + static const char WOLFSSL_SYS_OPENDIR_T[] = "opendir"; + static const char WOLFSSL_SYS_SETSOCKOPT_T[] = "setsockopt"; + static const char WOLFSSL_SYS_SOCKET_T[] = "socket"; + + /* switch with int mapped to function name for compatibility */ + static const char* wolfSSL_ERR_sys_func(int fun) + { + switch (fun) { + case WOLFSSL_SYS_ACCEPT: return WOLFSSL_SYS_ACCEPT_T; + case WOLFSSL_SYS_BIND: return WOLFSSL_SYS_BIND_T; + case WOLFSSL_SYS_CONNECT: return WOLFSSL_SYS_CONNECT_T; + case WOLFSSL_SYS_FOPEN: return WOLFSSL_SYS_FOPEN_T; + case WOLFSSL_SYS_FREAD: return WOLFSSL_SYS_FREAD_T; + case WOLFSSL_SYS_GETADDRINFO: return WOLFSSL_SYS_GETADDRINFO_T; + case WOLFSSL_SYS_GETSOCKOPT: return WOLFSSL_SYS_GETSOCKOPT_T; + case WOLFSSL_SYS_GETSOCKNAME: return WOLFSSL_SYS_GETSOCKNAME_T; + case WOLFSSL_SYS_GETHOSTBYNAME: return WOLFSSL_SYS_GETHOSTBYNAME_T; + case WOLFSSL_SYS_GETNAMEINFO: return WOLFSSL_SYS_GETNAMEINFO_T; + case WOLFSSL_SYS_GETSERVBYNAME: return WOLFSSL_SYS_GETSERVBYNAME_T; + case WOLFSSL_SYS_IOCTLSOCKET: return WOLFSSL_SYS_IOCTLSOCKET_T; + case WOLFSSL_SYS_LISTEN: return WOLFSSL_SYS_LISTEN_T; + case WOLFSSL_SYS_OPENDIR: return WOLFSSL_SYS_OPENDIR_T; + case WOLFSSL_SYS_SETSOCKOPT: return WOLFSSL_SYS_SETSOCKOPT_T; + case WOLFSSL_SYS_SOCKET: return WOLFSSL_SYS_SOCKET_T; + default: + return "NULL"; + } + } +#endif /* DEBUG_WOLFSSL */ + + + /* @TODO when having an error queue this needs to push to the queue */ + void wolfSSL_ERR_put_error(int lib, int fun, int err, const char* file, + int line) + { + WOLFSSL_ENTER("wolfSSL_ERR_put_error"); + + #ifndef DEBUG_WOLFSSL + (void)fun; + (void)err; + (void)file; + (void)line; + WOLFSSL_MSG("Not compiled in debug mode"); + #else + WOLFSSL_ERROR_LINE(err, wolfSSL_ERR_sys_func(fun), (unsigned int)line, + file, NULL); + #endif + (void)lib; + } + + unsigned long wolfSSL_ERR_get_error_line_data(const char** file, int* line, const char** data, int *flags) { @@ -14228,6 +14316,8 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md) (void)line; (void)data; (void)flags; + WOLFSSL_STUB("wolfSSL_ERR_get_error_line_data"); + return 0; } diff --git a/tests/api.c b/tests/api.c index c7c890646..69a5c7113 100644 --- a/tests/api.c +++ b/tests/api.c @@ -14814,6 +14814,52 @@ static void test_wolfSSL_pkcs8(void) } +static void test_wolfSSL_ERR_put_error(void) +{ + #if defined(OPENSSL_EXTRA) && defined(DEBUG_WOLFSSL) + const char* file; + int line; + + printf(testingFmt, "wolfSSL_ERR_put_error()"); + + ERR_put_error(0,SYS_F_ACCEPT, 0, "this file", 0); + AssertIntEQ(ERR_get_error_line(&file, &line), 0); + ERR_put_error(0,SYS_F_BIND, 1, "this file", 1); + AssertIntEQ(ERR_get_error_line(&file, &line), 1); + ERR_put_error(0,SYS_F_CONNECT, 2, "this file", 2); + AssertIntEQ(ERR_get_error_line(&file, &line), 2); + ERR_put_error(0,SYS_F_FOPEN, 3, "this file", 3); + AssertIntEQ(ERR_get_error_line(&file, &line), 3); + ERR_put_error(0,SYS_F_FREAD, 4, "this file", 4); + AssertIntEQ(ERR_get_error_line(&file, &line), 4); + ERR_put_error(0,SYS_F_GETADDRINFO, 5, "this file", 5); + AssertIntEQ(ERR_get_error_line(&file, &line), 5); + ERR_put_error(0,SYS_F_GETSOCKOPT, 6, "this file", 6); + AssertIntEQ(ERR_get_error_line(&file, &line), 6); + ERR_put_error(0,SYS_F_GETSOCKNAME, 7, "this file", 7); + AssertIntEQ(ERR_get_error_line(&file, &line), 7); + ERR_put_error(0,SYS_F_GETHOSTBYNAME, 8, "this file", 8); + AssertIntEQ(ERR_get_error_line(&file, &line), 8); + ERR_put_error(0,SYS_F_GETNAMEINFO, 9, "this file", 9); + AssertIntEQ(ERR_get_error_line(&file, &line), 9); + ERR_put_error(0,SYS_F_GETSERVBYNAME, 10, "this file", 10); + AssertIntEQ(ERR_get_error_line(&file, &line), 10); + ERR_put_error(0,SYS_F_IOCTLSOCKET, 11, "this file", 11); + AssertIntEQ(ERR_get_error_line(&file, &line), 11); + ERR_put_error(0,SYS_F_LISTEN, 12, "this file", 12); + AssertIntEQ(ERR_get_error_line(&file, &line), 12); + ERR_put_error(0,SYS_F_OPENDIR, 13, "this file", 13); + AssertIntEQ(ERR_get_error_line(&file, &line), 13); + ERR_put_error(0,SYS_F_SETSOCKOPT, 14, "this file", 14); + AssertIntEQ(ERR_get_error_line(&file, &line), 14); + ERR_put_error(0,SYS_F_SOCKET, 15, "this file", 15); + AssertIntEQ(ERR_get_error_line(&file, &line), 15); + + printf(resultFmt, passed); + #endif +} + + static void test_no_op_functions(void) { #if defined(OPENSSL_EXTRA) @@ -15613,6 +15659,7 @@ void ApiTest(void) test_wolfSSL_CTX_set_srp_password(); test_wolfSSL_pseudo_rand(); test_wolfSSL_pkcs8(); + test_wolfSSL_ERR_put_error(); /* test the no op functions for compatibility */ test_no_op_functions(); diff --git a/wolfssl/openssl/ssl.h b/wolfssl/openssl/ssl.h index 7996991a4..48e3e01c8 100644 --- a/wolfssl/openssl/ssl.h +++ b/wolfssl/openssl/ssl.h @@ -429,6 +429,26 @@ typedef WOLFSSL_X509_STORE_CTX X509_STORE_CTX; #define SSL_CTX_set_psk_server_callback wolfSSL_CTX_set_psk_server_callback #define SSL_set_psk_server_callback wolfSSL_set_psk_server_callback +/* system file ints for ERR_put_error */ +#define SYS_F_ACCEPT WOLFSSL_SYS_ACCEPT +#define SYS_F_BIND WOLFSSL_SYS_BIND +#define SYS_F_CONNECT WOLFSSL_SYS_CONNECT +#define SYS_F_FOPEN WOLFSSL_SYS_FOPEN +#define SYS_F_FREAD WOLFSSL_SYS_FREAD +#define SYS_F_GETADDRINFO WOLFSSL_SYS_GETADDRINFO +#define SYS_F_GETSOCKOPT WOLFSSL_SYS_GETSOCKOPT +#define SYS_F_GETSOCKNAME WOLFSSL_SYS_GETSOCKNAME +#define SYS_F_OPENDIR WOLFSSL_SYS_OPENDIR +#define SYS_F_SETSOCKOPT WOLFSSL_SYS_SETSOCKOPT +#define SYS_F_SOCKET WOLFSSL_SYS_SOCKET +#define SYS_F_GETHOSTBYNAME WOLFSSL_SYS_GETHOSTBYNAME +#define SYS_F_GETNAMEINFO WOLFSSL_SYS_GETNAMEINFO +#define SYS_F_GETSERVBYNAME WOLFSSL_SYS_GETSERVBYNAME +#define SYS_F_IOCTLSOCKET WOLFSSL_SYS_IOCTLSOCKET +#define SYS_F_LISTEN WOLFSSL_SYS_LISTEN + +#define ERR_put_error wolfSSL_ERR_put_error +#define ERR_get_error_line wolfSSL_ERR_get_error_line #define ERR_get_error_line_data wolfSSL_ERR_get_error_line_data #define ERR_get_error wolfSSL_ERR_get_error diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index a15ed608b..30863b4e3 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -1274,6 +1274,9 @@ enum { #endif +WOLFSSL_API void wolfSSL_ERR_put_error(int lib, int fun, int err, + const char* file, int line); +WOLFSSL_API unsigned long wolfSSL_ERR_get_error_line(const char**, int*); WOLFSSL_API unsigned long wolfSSL_ERR_get_error_line_data(const char**, int*, const char**, int *); @@ -2333,6 +2336,25 @@ WOLFSSL_API char* wolfSSL_ASN1_TIME_to_string(WOLFSSL_ASN1_TIME* time, #ifdef OPENSSL_EXTRA +enum { + WOLFSSL_SYS_ACCEPT = 0, + WOLFSSL_SYS_BIND, + WOLFSSL_SYS_CONNECT, + WOLFSSL_SYS_FOPEN, + WOLFSSL_SYS_FREAD, + WOLFSSL_SYS_GETADDRINFO, + WOLFSSL_SYS_GETSOCKOPT, + WOLFSSL_SYS_GETSOCKNAME, + WOLFSSL_SYS_GETHOSTBYNAME, + WOLFSSL_SYS_GETNAMEINFO, + WOLFSSL_SYS_GETSERVBYNAME, + WOLFSSL_SYS_IOCTLSOCKET, + WOLFSSL_SYS_LISTEN, + WOLFSSL_SYS_OPENDIR, + WOLFSSL_SYS_SETSOCKOPT, + WOLFSSL_SYS_SOCKET +}; + /* Object functions */ WOLFSSL_API const char * wolfSSL_OBJ_nid2sn(int n); WOLFSSL_API int wolfSSL_OBJ_obj2nid(const WOLFSSL_ASN1_OBJECT *o);