From bb07d0a4902350cff86746ef13edc8da9354ad67 Mon Sep 17 00:00:00 2001 From: Daniel Pouzzner Date: Thu, 20 Jan 2022 01:14:51 -0600 Subject: [PATCH] wolfio.c: refactor wolfIO_TcpConnect(() to use gethostbyname_r() if GNUC && !SINGLE_THREADED, for thread safety. --- src/wolfio.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/wolfio.c b/src/wolfio.c index 8480562ce..762b12b50 100644 --- a/src/wolfio.c +++ b/src/wolfio.c @@ -813,7 +813,13 @@ int wolfIO_TcpConnect(SOCKET_T* sockfd, const char* ip, word16 port, int to_sec) char strPort[6]; #else #if !defined(WOLFSSL_USE_POPEN_HOST) - HOSTENT* entry; +#if defined(__GNUC__) && !defined(SINGLE_THREADED) + HOSTENT entry_buf, *entry = NULL; + char *ghbn_r_buf = NULL; + int ghbn_r_errno; +#else + HOSTENT *entry; +#endif #endif SOCKADDR_IN *sin; #endif @@ -910,8 +916,15 @@ int wolfIO_TcpConnect(SOCKET_T* sockfd, const char* ip, word16 port, int to_sec) return -1; } } +#else +#if defined(__GNUC__) && !defined(SINGLE_THREADED) + ghbn_r_buf = (char *)XMALLOC(2048, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (ghbn_r_buf != NULL) { + gethostbyname_r(ip, &entry_buf, ghbn_r_buf, 2048, &entry, &ghbn_r_errno); + } #else entry = gethostbyname(ip); +#endif sin = (SOCKADDR_IN *)&addr; if (entry) { @@ -919,7 +932,12 @@ int wolfIO_TcpConnect(SOCKET_T* sockfd, const char* ip, word16 port, int to_sec) sin->sin_port = XHTONS(port); XMEMCPY(&sin->sin_addr.s_addr, entry->h_addr_list[0], entry->h_length); } - else { + +#if defined(__GNUC__) && !defined(SINGLE_THREADED) + XFREE(ghbn_r_buf, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + if (entry == NULL) { WOLFSSL_MSG("no addr info for responder"); return -1; }