If the netlink read() failed with ENOBUFS we know that we have missed at
least one message due to a socket receive buffer overrun. The only way
how to recover is to drop the old socket, open a fresh one and make a
cold-plug scan of the current system state.

Signed-off-by: Jan Klötzke <j...@kloetzke.net>
---
 util-linux/mdev.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/util-linux/mdev.c b/util-linux/mdev.c
index cfc1a38bc..91c4ff466 100644
--- a/util-linux/mdev.c
+++ b/util-linux/mdev.c
@@ -1206,6 +1206,16 @@ static void daemon_loop(char *temp, int fd)
 
                len = safe_read(fd, netbuf, sizeof(netbuf) - 1);
                if (len < 0) {
+                       if (errno == ENOBUFS) {
+                               /*
+                                * We ran out of socket receive buffer space.
+                                * Start from scratch.
+                                */
+                               dbg1s("uevent overrun! Rescanning...");
+                               close(fd);
+                               fd = daemon_init(temp);
+                               continue;
+                       }
                        bb_simple_perror_msg_and_die("read");
                }
                end = netbuf + len;
-- 
2.20.1

_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to