select.c: osmo_fd_unregister(): Avoid assert hit with old buggy users of the API

Change-Id: If77b84d603a42a216d550d9708eb62f645634a61
diff --git a/src/core/select.c b/src/core/select.c
index 67b0fd3..c60cd8e 100644
--- a/src/core/select.c
+++ b/src/core/select.c
@@ -223,13 +223,25 @@
 	 * 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);
 }