]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Abort when libuv at runtime mismatches libuv at compile time
authorOndřej Surý <ondrej@isc.org>
Mon, 25 Apr 2022 12:43:14 +0000 (14:43 +0200)
committerOndřej Surý <ondrej@isc.org>
Tue, 26 Apr 2022 09:40:40 +0000 (11:40 +0200)
When we compile with libuv that has some capabilities via flags passed
to f.e. uv_udp_listen() or uv_udp_bind(), the call with such flags would
fail with invalid arguments when older libuv version is linked at the
runtime that doesn't understand the flag that was available at the
compile time.

Enforce minimal libuv version when flags have been available at the
compile time, but are not available at the runtime.  This check is less
strict than enforcing the runtime libuv version to be same or higher
than compile time libuv version.

lib/isc/netmgr/netmgr.c
lib/isc/netmgr/uv-compat.h

index a73223942cdee513d9dd4d67837fb80a02517a1f..df8065daf5e7549b69d51037073b392a146711c9 100644 (file)
@@ -207,6 +207,18 @@ isc__nm_threadpool_initialize(uint32_t workers) {
        }
 }
 
+#if HAVE_DECL_UV_UDP_LINUX_RECVERR
+#define MINIMAL_UV_VERSION UV_VERSION(1, 42, 0)
+#elif HAVE_DECL_UV_UDP_MMSG_FREE
+#define MINIMAL_UV_VERSION UV_VERSION(1, 40, 0)
+#elif HAVE_DECL_UV_UDP_RECVMMSG
+#define MINIMAL_UV_VERSION UV_VERSION(1, 37, 0)
+#elif HAVE_DECL_UV_UDP_MMSG_CHUNK
+#define MINIMAL_UV_VERSION UV_VERSION(1, 35, 0)
+#else
+#define MINIMAL_UV_VERSION UV_VERSION(1, 0, 0)
+#endif
+
 void
 isc__netmgr_create(isc_mem_t *mctx, uint32_t workers, isc_nm_t **netmgrp) {
        isc_nm_t *mgr = NULL;
@@ -214,6 +226,14 @@ isc__netmgr_create(isc_mem_t *mctx, uint32_t workers, isc_nm_t **netmgrp) {
 
        REQUIRE(workers > 0);
 
+       if (uv_version() < MINIMAL_UV_VERSION) {
+               isc_error_fatal(__FILE__, __LINE__,
+                               "libuv version too old: running with libuv %s "
+                               "when compiled with libuv %s will lead to "
+                               "libuv failures because of unknown flags",
+                               uv_version_string(), UV_VERSION_STRING);
+       }
+
        isc__nm_threadpool_initialize(workers);
 
        mgr = isc_mem_get(mctx, sizeof(*mgr));
index 387d3c6940b12c463abad33938669a6963aac85d..3a103874e4ab2ab9554eba87014a74043ec78073 100644 (file)
 
 #define UV_VERSION(major, minor, patch) ((major << 16) | (minor << 8) | (patch))
 
+/*
+ * Copied verbatim from libuv/src/version.c
+ */
+
+#define UV_STRINGIFY(v)               UV_STRINGIFY_HELPER(v)
+#define UV_STRINGIFY_HELPER(v) #v
+
+#define UV_VERSION_STRING_BASE         \
+       UV_STRINGIFY(UV_VERSION_MAJOR) \
+       "." UV_STRINGIFY(UV_VERSION_MINOR) "." UV_STRINGIFY(UV_VERSION_PATCH)
+
+#if UV_VERSION_IS_RELEASE
+#define UV_VERSION_STRING UV_VERSION_STRING_BASE
+#else
+#define UV_VERSION_STRING UV_VERSION_STRING_BASE "-" UV_VERSION_SUFFIX
+#endif
+
 #if !defined(UV__ERR)
 #define UV__ERR(x) (-(x))
 #endif