fix(sockutls): Fix gai_strerror() impl to return const string

Previous gai_strerror() returned numeric representation of the code,
but used TLS storage, which might cause issues with stack sizes on all
tasks in the system. Alternatively we can leave the storage to static
only (which wouldn't be thread-safe) or we could one-time allocate and
never free (which is wrong).
This option uses hardcoded strings for common error codes used in lwip.
The disadvantage is that we might need to update the impl in the future
when lwip adds more codes.
This commit is contained in:
David Cermak
2025-01-07 12:17:35 +01:00
parent b4cb8f8a66
commit f12a205657
2 changed files with 31 additions and 11 deletions

View File

@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@ -18,13 +18,14 @@ extern "C" {
#endif #endif
/** /**
* @brief Returns a numeric string representing of `getaddrinfo()` error code. * @brief Returns a string representing of `getaddrinfo()` error code.
* *
* @param[in] ecode Error code returned by `getaddrinfo()`. * @param[in] errcode Error code returned by `getaddrinfo()`.
* *
* @return A pointer to a string describing the error. * @return A pointer to a string containing the error code, for example "EAI_NONAME"
* for EAI_NONAME error type.
*/ */
const char *gai_strerror(int ecode); const char *gai_strerror(int errcode);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -1,17 +1,36 @@
/* /*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
#include <stdio.h> #include <stdio.h>
#include "gai_strerror.h" #include "gai_strerror.h"
#include "lwip/netdb.h"
_Thread_local char gai_strerror_string[32]; #define HANDLE_GAI_ERROR(code) \
case code: return #code;
const char *gai_strerror(int ecode) const char *gai_strerror(int errcode)
{ {
if (snprintf(gai_strerror_string, sizeof(gai_strerror_string), "EAI error:%d", ecode) < 0) { switch (errcode) {
return "gai_strerror() failed"; /* lwip defined DNS codes */
HANDLE_GAI_ERROR(EAI_BADFLAGS)
HANDLE_GAI_ERROR(EAI_FAIL)
HANDLE_GAI_ERROR(EAI_FAMILY)
HANDLE_GAI_ERROR(EAI_MEMORY)
HANDLE_GAI_ERROR(EAI_NONAME)
HANDLE_GAI_ERROR(EAI_SERVICE)
/* other error codes optionally defined in platform/newlib or toolchain */
#ifdef EAI_AGAIN
HANDLE_GAI_ERROR(EAI_AGAIN)
#endif
#ifdef EAI_SOCKTYPE
HANDLE_GAI_ERROR(EAI_SOCKTYPE)
#endif
#ifdef EAI_SYSTEM
HANDLE_GAI_ERROR(EAI_SYSTEM)
#endif
default:
return "Unknown error";
} }
return gai_strerror_string;
} }