ifplugd: use a larger netlink buffer
authorTito Ragusa <farmatito@tiscali.it>
Sun, 4 Aug 2013 16:08:40 +0000 (18:08 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 4 Aug 2013 16:10:26 +0000 (18:10 +0200)
function                                             old     new   delta
check_existence_through_netlink                      310     321     +11

Signed-off-by: Tito Ragusa <farmatito@tiscali.it>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/ifplugd.c

index 3cdc2c9d29e58b27bd79749b5ec3c3b9ac71da38..b578f4c61c3ef6ec17ea4cf14aae3cf177c6e7ad 100644 (file)
@@ -451,20 +451,24 @@ static smallint detect_link(void)
 static NOINLINE int check_existence_through_netlink(void)
 {
        int iface_len;
-       char replybuf[1024];
+       /* Buffer was 1K, but on linux-3.9.9 it was reported to be too small.
+        * netlink.h: "limit to 8K to avoid MSG_TRUNC when PAGE_SIZE is very large".
+        * Note: on error returns (-1) we exit, no need to free replybuf.
+        */
+       enum { BUF_SIZE = 8 * 1024 };
+       char *replybuf = xmalloc(BUF_SIZE);
 
        iface_len = strlen(G.iface);
        while (1) {
                struct nlmsghdr *mhdr;
                ssize_t bytes;
 
-               bytes = recv(netlink_fd, &replybuf, sizeof(replybuf), MSG_DONTWAIT);
+               bytes = recv(netlink_fd, replybuf, BUF_SIZE, MSG_DONTWAIT);
                if (bytes < 0) {
                        if (errno == EAGAIN)
-                               return G.iface_exists;
+                               goto ret;
                        if (errno == EINTR)
                                continue;
-
                        bb_perror_msg("netlink: recv");
                        return -1;
                }
@@ -507,6 +511,8 @@ static NOINLINE int check_existence_through_netlink(void)
                }
        }
 
+ ret:
+       free(replybuf);
        return G.iface_exists;
 }