From a14f22f65bf7bb69a4a11db22011cc1cd57e5ee4 Mon Sep 17 00:00:00 2001 From: Jan Schmidt Date: Fri, 20 Jan 2017 14:17:03 +1100 Subject: [PATCH] netconn_gethostbyname: Fix race reporting success If the DNS request is dispatched and performed very quickly, then it can complete before tcpip_callback() actually returns, in which case we'll destroy the actual err_t error value passed in the message. Use a local variable for the tcpip_callback error code so that can't happen. Resolves #269 https://github.com/espressif/esp-idf/pull/269 --- components/lwip/api/api_lib.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/components/lwip/api/api_lib.c b/components/lwip/api/api_lib.c index 087115f0b..e5c247f0b 100755 --- a/components/lwip/api/api_lib.c +++ b/components/lwip/api/api_lib.c @@ -880,10 +880,11 @@ netconn_gethostbyname(const char *name, ip_addr_t *addr) { API_VAR_DECLARE(struct dns_api_msg, msg); + err_t localerr; #if !LWIP_MPU_COMPATIBLE sys_sem_t sem; #endif /* LWIP_MPU_COMPATIBLE */ - err_t err; + err_t err = ERR_OK; LWIP_ERROR("netconn_gethostbyname: invalid name", (name != NULL), return ERR_ARG;); LWIP_ERROR("netconn_gethostbyname: invalid addr", (addr != NULL), return ERR_ARG;); @@ -918,14 +919,14 @@ netconn_gethostbyname(const char *name, ip_addr_t *addr) } #endif /* LWIP_NETCONN_SEM_PER_THREAD */ - err = tcpip_callback(lwip_netconn_do_gethostbyname, &API_VAR_REF(msg)); - if (err != ERR_OK) { + localerr = tcpip_callback(lwip_netconn_do_gethostbyname, &API_VAR_REF(msg)); + if (localerr != ERR_OK) { #if !LWIP_NETCONN_SEM_PER_THREAD sys_sem_free(API_EXPR_REF(API_VAR_REF(msg).sem)); #endif /* !LWIP_NETCONN_SEM_PER_THREAD */ API_VAR_FREE(MEMP_DNS_API_MSG, msg); - return err; + return localerr; } sys_sem_wait(API_EXPR_REF_SEM(API_VAR_REF(msg).sem));