From a1bd9e441b10a94f97ec8c20daf7fa90983e7cc2 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Wed, 20 Mar 2024 10:53:18 +0100 Subject: [PATCH] api_msg: Fix crash to fail-safe error if cannot get semaphore --- src/api/api_lib.c | 6 ++++++ src/api/sockets.c | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/src/api/api_lib.c b/src/api/api_lib.c index ffa14d65..27189cb1 100644 --- a/src/api/api_lib.c +++ b/src/api/api_lib.c @@ -126,6 +126,9 @@ netconn_apimsg(tcpip_callback_fn fn, struct api_msg *apimsg) #if LWIP_NETCONN_SEM_PER_THREAD apimsg->op_completed_sem = LWIP_NETCONN_THREAD_SEM_GET(); + if (!sys_sem_valid(apimsg->op_completed_sem)) { + return ERR_MEM; + } #endif /* LWIP_NETCONN_SEM_PER_THREAD */ err = tcpip_send_msg_wait_sem(fn, apimsg, LWIP_API_MSG_SEM(apimsg)); @@ -1314,6 +1317,9 @@ netconn_gethostbyname(const char *name, ip_addr_t *addr) #endif /* LWIP_IPV4 && LWIP_IPV6 */ #if LWIP_NETCONN_SEM_PER_THREAD API_VAR_REF(msg).sem = LWIP_NETCONN_THREAD_SEM_GET(); + if (!sys_sem_valid(API_VAR_REF(msg).sem)) { + return ERR_MEM; + } #else /* LWIP_NETCONN_SEM_PER_THREAD*/ err = sys_sem_new(API_EXPR_REF(API_VAR_REF(msg).sem), 0); if (err != ERR_OK) { diff --git a/src/api/sockets.c b/src/api/sockets.c index 5f2382cd..dcdccfb8 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -2029,6 +2029,10 @@ lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, API_SELECT_CB_VAR_REF(select_cb).exceptset = exceptset; #if LWIP_NETCONN_SEM_PER_THREAD API_SELECT_CB_VAR_REF(select_cb).sem = LWIP_NETCONN_THREAD_SEM_GET(); + if (!sys_sem_valid(API_SELECT_CB_VAR_REF(select_cb).sem)) { + set_errno(ENOMEM); + return -1; + } #else /* LWIP_NETCONN_SEM_PER_THREAD */ if (sys_sem_new(&API_SELECT_CB_VAR_REF(select_cb).sem, 0) != ERR_OK) { /* failed to create semaphore */ @@ -2374,6 +2378,11 @@ lwip_poll(struct pollfd *fds, nfds_t nfds, int timeout) API_SELECT_CB_VAR_REF(select_cb).poll_nfds = nfds; #if LWIP_NETCONN_SEM_PER_THREAD API_SELECT_CB_VAR_REF(select_cb).sem = LWIP_NETCONN_THREAD_SEM_GET(); + if (!sys_sem_valid(API_SELECT_CB_VAR_REF(select_cb).sem)) { + set_errno(ENOMEM); + return -1; + } + #else /* LWIP_NETCONN_SEM_PER_THREAD */ if (sys_sem_new(&API_SELECT_CB_VAR_REF(select_cb).sem, 0) != ERR_OK) { /* failed to create semaphore */