0e847a
From 5fdb358edc57f41292680a80e9f80f9c2c7f9742 Mon Sep 17 00:00:00 2001
0e847a
From: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
0e847a
Date: Mon, 11 Jul 2016 18:36:05 +0100
0e847a
Subject: [PATCH] Fix logic error in Linux netlink code.
0e847a
0e847a
This could cause dnsmasq to enter a tight loop on systems
0e847a
with a very large number of network interfaces.
0e847a
0e847a
(cherry picked from commit 1d07667ac77c55b9de56b1b2c385167e0e0ec27a)
0e847a
---
0e847a
 src/netlink.c | 8 +++++++-
0e847a
 1 file changed, 7 insertions(+), 1 deletion(-)
0e847a
0e847a
diff --git a/src/netlink.c b/src/netlink.c
0e847a
index 049247b..8cd51af 100644
0e847a
--- a/src/netlink.c
0e847a
+++ b/src/netlink.c
0e847a
@@ -188,11 +188,17 @@ int iface_enumerate(int family, void *parm, int (*callback)())
0e847a
 	}
0e847a
 
0e847a
       for (h = (struct nlmsghdr *)iov.iov_base; NLMSG_OK(h, (size_t)len); h = NLMSG_NEXT(h, len))
0e847a
-	if (h->nlmsg_seq != seq || h->nlmsg_pid != netlink_pid || h->nlmsg_type == NLMSG_ERROR)
0e847a
+	if (h->nlmsg_pid != netlink_pid || h->nlmsg_type == NLMSG_ERROR)
0e847a
 	  {
0e847a
 	    /* May be multicast arriving async */
0e847a
 	    nl_async(h);
0e847a
 	  }
0e847a
+	else if (h->nlmsg_seq != seq)
0e847a
+	  {
0e847a
+	    /* May be part of incomplete response to previous request after
0e847a
+	       ENOBUFS. Drop it. */
0e847a
+	    continue;
0e847a
+	  }
0e847a
 	else if (h->nlmsg_type == NLMSG_DONE)
0e847a
 	  return callback_ok;
0e847a
 	else if (h->nlmsg_type == RTM_NEWADDR && family != AF_UNSPEC && family != AF_LOCAL)
0e847a
-- 
0e847a
2.26.2
0e847a