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
This commit is contained in:
parent
ac412feb69
commit
a14f22f65b
1 changed files with 5 additions and 4 deletions
|
@ -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));
|
||||
|
|
Loading…
Reference in a new issue