mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
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
@ -880,10 +880,11 @@ netconn_gethostbyname(const char *name, ip_addr_t *addr)
|
|||||||
{
|
{
|
||||||
|
|
||||||
API_VAR_DECLARE(struct dns_api_msg, msg);
|
API_VAR_DECLARE(struct dns_api_msg, msg);
|
||||||
|
err_t localerr;
|
||||||
#if !LWIP_MPU_COMPATIBLE
|
#if !LWIP_MPU_COMPATIBLE
|
||||||
sys_sem_t sem;
|
sys_sem_t sem;
|
||||||
#endif /* LWIP_MPU_COMPATIBLE */
|
#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 name", (name != NULL), return ERR_ARG;);
|
||||||
LWIP_ERROR("netconn_gethostbyname: invalid addr", (addr != 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 */
|
#endif /* LWIP_NETCONN_SEM_PER_THREAD */
|
||||||
|
|
||||||
err = tcpip_callback(lwip_netconn_do_gethostbyname, &API_VAR_REF(msg));
|
localerr = tcpip_callback(lwip_netconn_do_gethostbyname, &API_VAR_REF(msg));
|
||||||
if (err != ERR_OK) {
|
if (localerr != ERR_OK) {
|
||||||
#if !LWIP_NETCONN_SEM_PER_THREAD
|
#if !LWIP_NETCONN_SEM_PER_THREAD
|
||||||
sys_sem_free(API_EXPR_REF(API_VAR_REF(msg).sem));
|
sys_sem_free(API_EXPR_REF(API_VAR_REF(msg).sem));
|
||||||
#endif /* !LWIP_NETCONN_SEM_PER_THREAD */
|
#endif /* !LWIP_NETCONN_SEM_PER_THREAD */
|
||||||
|
|
||||||
API_VAR_FREE(MEMP_DNS_API_MSG, msg);
|
API_VAR_FREE(MEMP_DNS_API_MSG, msg);
|
||||||
return err;
|
return localerr;
|
||||||
}
|
}
|
||||||
|
|
||||||
sys_sem_wait(API_EXPR_REF_SEM(API_VAR_REF(msg).sem));
|
sys_sem_wait(API_EXPR_REF_SEM(API_VAR_REF(msg).sem));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user