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{};