[PATCH 1/2] iproute: codeshrink netlink message length check

Natanael Copa ncopa at alpinelinux.org
Tue Nov 12 11:04:24 UTC 2019


reduce size by de-duplicate netlink message length check

function                                             old     new   delta
check_nlmsg_len                                        -      22     +22
print_route                                         1901    1893      -8
print_neigh                                         1082    1073      -9
iproute_get                                          889     880      -9
.rodata                                           139741  139723     -18
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/4 up/down: 22/-44)            Total: -22
bytes
   text	   data	    bss	    dec	    hex	filename
 876539	  15636	   2080	 894255	  da52f	busybox_old
 876517	  15636	   2080	 894233	  da519	busybox_unstripped
---
 networking/libiproute/ip_common.h |  1 +
 networking/libiproute/ipneigh.c   |  4 +---
 networking/libiproute/iproute.c   | 14 +++++++++-----
 3 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/networking/libiproute/ip_common.h b/networking/libiproute/ip_common.h
index 40171bed9..9f7f927c7 100644
--- a/networking/libiproute/ip_common.h
+++ b/networking/libiproute/ip_common.h
@@ -30,6 +30,7 @@ int FAST_FUNC do_iplink(char **argv);
 //int FAST_FUNC do_ipmonitor(char **argv);
 //int FAST_FUNC do_multiaddr(char **argv);
 //int FAST_FUNC do_multiroute(char **argv);
+int FAST_FUNC check_nlmsg_len(int len);
 
 POP_SAVED_FUNCTION_VISIBILITY
 
diff --git a/networking/libiproute/ipneigh.c b/networking/libiproute/ipneigh.c
index b9b4f4b31..8771a9ad9 100644
--- a/networking/libiproute/ipneigh.c
+++ b/networking/libiproute/ipneigh.c
@@ -102,9 +102,7 @@ static int FAST_FUNC print_neigh(const struct sockaddr_nl *who UNUSED_PARAM,
 				     n->nlmsg_flags);
 	}
 	len -= NLMSG_LENGTH(sizeof(*r));
-	if (len < 0) {
-		bb_error_msg_and_die("BUG: wrong nlmsg len %d", len);
-	}
+	check_nlmsg_len(len);
 
 	if (G_filter.flushb && n->nlmsg_type != RTM_NEWNEIGH)
 		return 0;
diff --git a/networking/libiproute/iproute.c b/networking/libiproute/iproute.c
index 5a972f8b2..a858d57dc 100644
--- a/networking/libiproute/iproute.c
+++ b/networking/libiproute/iproute.c
@@ -64,6 +64,13 @@ static int flush_update(void)
 	return 0;
 }
 
+int check_nlmsg_len(int len)
+{
+	if (len < 0) {
+		bb_error_msg_and_die("wrong nlmsg len %d", len);
+	}
+}
+
 static int FAST_FUNC print_route(const struct sockaddr_nl *who UNUSED_PARAM,
 		struct nlmsghdr *n, void *arg UNUSED_PARAM)
 {
@@ -83,8 +90,7 @@ static int FAST_FUNC print_route(const struct sockaddr_nl *who UNUSED_PARAM,
 	if (G_filter.flushb && n->nlmsg_type != RTM_NEWROUTE)
 		return 0;
 	len -= NLMSG_LENGTH(sizeof(*r));
-	if (len < 0)
-		bb_error_msg_and_die("wrong nlmsg len %d", len);
+	check_nlmsg_len(len);
 
 	//memset(tb, 0, sizeof(tb)); - parse_rtattr does this
 	parse_rtattr(tb, RTA_MAX, RTM_RTA(r), len);
@@ -1080,9 +1086,7 @@ static int iproute_get(char **argv)
 			bb_simple_error_msg_and_die("not a route?");
 		}
 		len -= NLMSG_LENGTH(sizeof(*r));
-		if (len < 0) {
-			bb_error_msg_and_die("wrong len %d", len);
-		}
+		check_nlmsg_len(len);
 
 		//memset(tb, 0, sizeof(tb)); - parse_rtattr does this
 		parse_rtattr(tb, RTA_MAX, RTM_RTA(r), len);
-- 
2.23.0



More information about the busybox mailing list