rtnetlink: Handle parsing errors more gracefully
Change-Id: Ia0699263dc8f3f356e6d265fade4c13801fe730a
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/src/rtnetlink_server.cpp b/src/rtnetlink_server.cpp
index d226efa..4645367 100644
--- a/src/rtnetlink_server.cpp
+++ b/src/rtnetlink_server.cpp
@@ -135,26 +135,34 @@
{
refreshObjectTimer->restartOnce(refreshTimeout);
}
- switch (hdr.nlmsg_type)
+ try
{
- case RTM_NEWROUTE:
- rthandler(m, true, data);
- break;
- case RTM_DELROUTE:
- rthandler(m, false, data);
- break;
- case RTM_NEWADDR:
- addrhandler(m, true, data);
- break;
- case RTM_DELADDR:
- addrhandler(m, false, data);
- break;
- case RTM_NEWNEIGH:
- neighhandler(m, true, data);
- break;
- case RTM_DELNEIGH:
- neighhandler(m, false, data);
- break;
+ switch (hdr.nlmsg_type)
+ {
+ case RTM_NEWROUTE:
+ rthandler(m, true, data);
+ break;
+ case RTM_DELROUTE:
+ rthandler(m, false, data);
+ break;
+ case RTM_NEWADDR:
+ addrhandler(m, true, data);
+ break;
+ case RTM_DELADDR:
+ addrhandler(m, false, data);
+ break;
+ case RTM_NEWNEIGH:
+ neighhandler(m, true, data);
+ break;
+ case RTM_DELNEIGH:
+ neighhandler(m, false, data);
+ break;
+ }
+ }
+ catch (const std::exception& e)
+ {
+ auto msg = fmt::format("Failed parsing netlink event: {}", e.what());
+ log<level::ERR>(msg.c_str());
}
}
diff --git a/src/system_queries.cpp b/src/system_queries.cpp
index 35dfa10..5006095 100644
--- a/src/system_queries.cpp
+++ b/src/system_queries.cpp
@@ -249,10 +249,18 @@
{
std::vector<InterfaceInfo> ret;
auto cb = [&](const nlmsghdr& hdr, std::string_view msg) {
- auto info = detail::parseInterface(hdr, msg);
- if (detail::validateNewInterface(info))
+ try
{
- ret.emplace_back(std::move(info));
+ auto info = detail::parseInterface(hdr, msg);
+ if (detail::validateNewInterface(info))
+ {
+ ret.emplace_back(std::move(info));
+ }
+ }
+ catch (const std::exception& e)
+ {
+ auto msg = fmt::format("Failed parsing interface: {}", e.what());
+ log<level::ERR>(msg.c_str());
}
};
ifinfomsg msg{};
@@ -264,10 +272,19 @@
{
std::vector<AddressInfo> ret;
auto cb = [&](const nlmsghdr&, std::string_view msg) {
- auto info = netlink::addrFromRtm(msg);
- if (detail::validateNewAddr(info, filter))
+ try
{
- ret.emplace_back(std::move(info));
+ auto info = netlink::addrFromRtm(msg);
+ if (detail::validateNewAddr(info, filter))
+ {
+ ret.emplace_back(std::move(info));
+ }
+ }
+ catch (const std::exception& e)
+ {
+ auto msg = fmt::format("Failed parsing address for ifidx {}: {}",
+ filter.ifidx, e.what());
+ log<level::ERR>(msg.c_str());
}
};
ifaddrmsg msg{};
@@ -280,10 +297,19 @@
{
std::vector<NeighborInfo> ret;
auto cb = [&](const nlmsghdr&, std::string_view msg) {
- auto info = netlink::neighFromRtm(msg);
- if (detail::validateNewNeigh(info, filter))
+ try
{
- ret.push_back(std::move(info));
+ auto info = netlink::neighFromRtm(msg);
+ if (detail::validateNewNeigh(info, filter))
+ {
+ ret.push_back(std::move(info));
+ }
+ }
+ catch (const std::exception& e)
+ {
+ auto msg = fmt::format("Failed parsing neighbor for ifidx {}: {}",
+ filter.ifidx, e.what());
+ log<level::ERR>(msg.c_str());
}
};
ndmsg msg{};