From bf5926283bb6605624c2a53ea87fa4751791f37a Mon Sep 17 00:00:00 2001 From: Benjamin Valentin Date: Sun, 29 May 2022 22:39:24 +0200 Subject: [PATCH] gnrc_netreg: drain mbox on unregister If there are still messages in the mbox when gnrc_netreg_unregister() is called, we must release the associated pktbuf snips, otherwise they are leaked away forever. E.g. `sock_udp_close()` was called without receiving all messages with `sock_udp_recv()`. --- sys/net/gnrc/netreg/gnrc_netreg.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/sys/net/gnrc/netreg/gnrc_netreg.c b/sys/net/gnrc/netreg/gnrc_netreg.c index 5094cf4a85..de1485834b 100644 --- a/sys/net/gnrc/netreg/gnrc_netreg.c +++ b/sys/net/gnrc/netreg/gnrc_netreg.c @@ -73,6 +73,16 @@ void gnrc_netreg_unregister(gnrc_nettype_t type, gnrc_netreg_entry_t *entry) } LL_DELETE(netreg[type], entry); + +#if defined(MODULE_GNRC_NETAPI_MBOX) + /* drain packets still in the mbox */ + if (entry->type == GNRC_NETREG_TYPE_MBOX) { + msg_t msg; + while (mbox_try_get(entry->target.mbox, &msg)) { + gnrc_pktbuf_release_error(msg.content.ptr, EBADF); + } + } +#endif } /**