From ea7df17df3b89937d4bdd44752a8d0f33c192308 Mon Sep 17 00:00:00 2001 From: Jonas Gorski Date: Mon, 8 Dec 2025 11:07:21 +0100 Subject: [PATCH] handle changed return code in libnl 3.12 With libnl 3.12 the return code for -EHOSTUNREACH changed from -NLE_FAILURE to -NLE_HOSTUNREACH. This causes our code to assume something fatal broke, and terminate on unreachable: baseboxd[1756]: F20251206 09:08:38.378911 1935 nl_route_query.h:95] query_route:%sHost is unreachable baseboxd[1756]: *** Check failure stack trace: *** baseboxd[1756]: @ 0x7fc6c510604d google::LogMessage::Fail() baseboxd[1756]: @ 0x7fc6c51085c6 google::LogMessage::SendToLog() baseboxd[1756]: @ 0x7fc6c5105b8a google::LogMessage::Flush() baseboxd[1756]: @ 0x7fc6c5108c39 google::LogMessageFatal::~LogMessageFatal() baseboxd[1756]: @ 0x55d9501e117e (unknown) baseboxd[1756]: @ 0x55d9501df17f (unknown) baseboxd[1756]: @ 0x55d9501ba68b (unknown) baseboxd[1756]: @ 0x7fc6c45b9083 rofl::cthread::handle_wakeup() baseboxd[1756]: @ 0x7fc6c45b9718 rofl::cthread::run_loop() baseboxd[1756]: @ 0x7fc6c3b8f5ea (unknown) baseboxd[1756]: @ 0x7fc6c3c11300 (unknown) Fix this by checking for -NLE_HOSTUNREACH as well, and add a define in case we build against older libnl versions. We still have to check for -NLE_FAILURE anyway. Signed-off-by: Jonas Gorski --- meson.build | 4 ++++ src/netlink/nl_route_query.h | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index 180013b9..278b01f9 100644 --- a/meson.build +++ b/meson.build @@ -130,6 +130,10 @@ if cppc.has_header_symbol('netlink/route/link/bonding.h', 'rtnl_link_bond_get_mo add_global_arguments('-DHAVE_RTNL_LINK_BOND_GET_MODE', language: 'cpp') endif +if not cppc.has_header_symbol('netlink/errno.h', 'NLE_HOSTUNREACH', dependencies: libnl, required: false) + add_global_arguments('-DNLE_HOSTUNREACH=35', language: 'cpp') +endif + if cppc.has_header('netlink/route/bridge_vlan.h', dependencies: libnl, required: false) add_global_arguments('-DHAVE_NETLINK_ROUTE_BRIDGE_VLAN_H', language: 'cpp') endif diff --git a/src/netlink/nl_route_query.h b/src/netlink/nl_route_query.h index 9a793241..5ec7ae0c 100644 --- a/src/netlink/nl_route_query.h +++ b/src/netlink/nl_route_query.h @@ -87,9 +87,9 @@ class nl_route_query final { /* * if there is no default route, and no matching route, the kernel will * respond with -ENETUNREACH or -EHOSTUNREACH, which libnl translates to - * -NLE_FAILURE. + * -NLE_FAILURE resp -NLE_HOSTUNREACH. */ - if (err == -NLE_FAILURE) + if (err == -NLE_HOSTUNREACH || err == -NLE_FAILURE) return nullptr; LOG(FATAL) << __FUNCTION__ << ":%s" << nl_geterror(err);