aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2023-03-14 12:14:36 +0100
committerPau Espin Pedrol <pespin@sysmocom.de>2023-03-14 13:13:47 +0100
commit6fd7f41672182e0aafaaeb695f1c74ad903f52ba (patch)
treed8677b7bf7b9681da3f0d3f7d15cdfd929e6b037
parent3b450f0233ae4d296af6a6b1e40f8183e95d94b7 (diff)
select.c: osmo_fd_unregister(): Avoid assert hit with old buggy users of the API
-rw-r--r--src/core/select.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/core/select.c b/src/core/select.c
index 67b0fd38..c60cd8eb 100644
--- a/src/core/select.c
+++ b/src/core/select.c
@@ -223,13 +223,25 @@ void osmo_fd_unregister(struct osmo_fd *fd)
* osmo_fd_is_registered() */
unregistered_count++;
llist_del(&fd->list);
- OSMO_ASSERT(fd->fd >= 0);
- OSMO_ASSERT(fd->fd <= maxfd);
- osmo_fd_lookup.table[fd->fd] = NULL;
#ifndef FORCE_IO_SELECT
g_poll.num_registered--;
#endif /* FORCE_IO_SELECT */
+ if (OSMO_UNLIKELY(fd->fd < 0 || fd->fd > maxfd)) {
+ /* Some old users used to incorrectly set fd = -1 *before* calling osmo_unregister().
+ * Hence, in order to keep backward compatibility it's not possible to assert() here.
+ * Instead, print an error message since this is actually a bug in the API user. */
+#ifdef OSMO_FD_CHECK
+ osmo_panic("osmo_fd_unregister(fd=%u) out of expected range (0..%u), fix your code!!!\n",
+ fd->fd, maxfd);
+#else
+ fprintf(stderr, "osmo_fd_unregister(fd=%u) out of expected range (0..%u), fix your code!!!\n",
+ fd->fd, maxfd);
+ return;
+#endif
+ }
+
+ osmo_fd_lookup.table[fd->fd] = NULL;
/* If existent, free any statistical data */
osmo_stats_tcp_osmo_fd_unregister(fd);
}