[source] busybox: libnetlink: fix alignment of netlink messages

LEDE Commits lede-commits at lists.infradead.org
Fri Sep 16 14:11:42 PDT 2016


hauke pushed a commit to source.git, branch master:
https://git.lede-project.org/8b5e1282509290e890b4189e7fc5fc8459b4c0d0

commit 8b5e1282509290e890b4189e7fc5fc8459b4c0d0
Author: Hauke Mehrtens <hauke at hauke-m.de>
AuthorDate: Fri Sep 16 22:44:41 2016 +0200

    busybox: libnetlink: fix alignment of netlink messages
    
    A padding to align a message should not only be added between
    different attributes of a netlink message, but also at the end of the
    message to pad it to the correct size.
    
    Without this patch the following command does not work and returns an
    error code:
    ip link add type nlmon
    
    Signed-off-by: Hauke Mehrtens <hauke at hauke-m.de>
---
 .../busybox/patches/302-netlink-alignment.patch    | 100 +++++++++++++++++++++
 1 file changed, 100 insertions(+)

diff --git a/package/utils/busybox/patches/302-netlink-alignment.patch b/package/utils/busybox/patches/302-netlink-alignment.patch
new file mode 100644
index 0000000..4cd25b1
--- /dev/null
+++ b/package/utils/busybox/patches/302-netlink-alignment.patch
@@ -0,0 +1,100 @@
+From a843f09a4d4428cf11ca02307e60058251b05743 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke at hauke-m.de>
+Date: Fri, 16 Sep 2016 21:52:03 +0200
+Subject: [PATCH] libnetlink: fix alignment of netlink messages
+
+An padding to align a message should not only be added between
+different attributes of a netlink message, but also at the end of the
+message to pad it to the correct size.
+
+Without this patch the following command does not work and returns an
+error code:
+ip link add type nlmon
+
+Without this ip from busybox sends this:
+sendmsg(3, {msg_name={sa_family=AF_NETLINK, nl_pid=0, nl_groups=00000000}, msg_namelen=12, msg_iov=[{iov_base={{len=45, type=0x10 /* NLMSG_??? */, flags=NLM_F_REQUEST|NLM_F_ACK|0x600, seq=1474057401, pid=0}, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\0\22\0\t\0\1nlmon"}, iov_len=45}], msg_iovlen=1, msg_controllen=0, msg_flags=0}, 0) = 45
+return value: 2
+
+The normal ip utile from iproute2 sends this:
+sendmsg(3, {msg_name={sa_family=AF_NETLINK, nl_pid=0, nl_groups=00000000}, msg_namelen=12, msg_iov=[{iov_base={{len=48, type=0x10 /* NLMSG_??? */, flags=NLM_F_REQUEST|NLM_F_ACK|0x600, seq=1473716938, pid=0}, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\0\22\0\t\0\1nlmon\0\0\0"}, iov_len=48}], msg_iovlen=1, msg_controllen=0, msg_flags=0}, 0) = 48
+return value: 0
+
+With this patch ip from busybox sends this:
+sendmsg(3, {msg_name={sa_family=AF_NETLINK, nl_pid=0, nl_groups=00000000}, msg_namelen=12, msg_iov=[{iov_base={{len=48, type=0x10 /* NLMSG_??? */, flags=NLM_F_REQUEST|NLM_F_ACK|0x600, seq=1473716908, pid=0}, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\0\22\0\t\0\1nlmon\0\0\0"}, iov_len=48}], msg_iovlen=1, msg_controllen=0, msg_flags=0}, 0) = 48
+return value: 0
+
+Signed-off-by: Hauke Mehrtens <hauke at hauke-m.de>
+---
+ networking/libiproute/libnetlink.c | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+--- a/networking/libiproute/libnetlink.c
++++ b/networking/libiproute/libnetlink.c
+@@ -338,14 +338,14 @@ int FAST_FUNC addattr32(struct nlmsghdr
+ 	int len = RTA_LENGTH(4);
+ 	struct rtattr *rta;
+ 
+-	if ((int)(NLMSG_ALIGN(n->nlmsg_len) + len) > maxlen) {
++	if ((int)(NLMSG_ALIGN(n->nlmsg_len + len)) > maxlen) {
+ 		return -1;
+ 	}
+ 	rta = (struct rtattr*)(((char*)n) + NLMSG_ALIGN(n->nlmsg_len));
+ 	rta->rta_type = type;
+ 	rta->rta_len = len;
+ 	move_to_unaligned32(RTA_DATA(rta), data);
+-	n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + len;
++	n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len + len);
+ 	return 0;
+ }
+ 
+@@ -354,14 +354,14 @@ int FAST_FUNC addattr_l(struct nlmsghdr
+ 	int len = RTA_LENGTH(alen);
+ 	struct rtattr *rta;
+ 
+-	if ((int)(NLMSG_ALIGN(n->nlmsg_len) + len) > maxlen) {
++	if ((int)(NLMSG_ALIGN(n->nlmsg_len + len)) > maxlen) {
+ 		return -1;
+ 	}
+ 	rta = (struct rtattr*)(((char*)n) + NLMSG_ALIGN(n->nlmsg_len));
+ 	rta->rta_type = type;
+ 	rta->rta_len = len;
+ 	memcpy(RTA_DATA(rta), data, alen);
+-	n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + len;
++	n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len + len);
+ 	return 0;
+ }
+ 
+@@ -370,14 +370,14 @@ int FAST_FUNC rta_addattr32(struct rtatt
+ 	int len = RTA_LENGTH(4);
+ 	struct rtattr *subrta;
+ 
+-	if (RTA_ALIGN(rta->rta_len) + len > maxlen) {
++	if (RTA_ALIGN(rta->rta_len + len) > maxlen) {
+ 		return -1;
+ 	}
+ 	subrta = (struct rtattr*)(((char*)rta) + RTA_ALIGN(rta->rta_len));
+ 	subrta->rta_type = type;
+ 	subrta->rta_len = len;
+ 	move_to_unaligned32(RTA_DATA(subrta), data);
+-	rta->rta_len = NLMSG_ALIGN(rta->rta_len) + len;
++	rta->rta_len = NLMSG_ALIGN(rta->rta_len + len);
+ 	return 0;
+ }
+ 
+@@ -386,14 +386,14 @@ int FAST_FUNC rta_addattr_l(struct rtatt
+ 	struct rtattr *subrta;
+ 	int len = RTA_LENGTH(alen);
+ 
+-	if (RTA_ALIGN(rta->rta_len) + len > maxlen) {
++	if (RTA_ALIGN(rta->rta_len + len) > maxlen) {
+ 		return -1;
+ 	}
+ 	subrta = (struct rtattr*)(((char*)rta) + RTA_ALIGN(rta->rta_len));
+ 	subrta->rta_type = type;
+ 	subrta->rta_len = len;
+ 	memcpy(RTA_DATA(subrta), data, alen);
+-	rta->rta_len = NLMSG_ALIGN(rta->rta_len) + len;
++	rta->rta_len = NLMSG_ALIGN(rta->rta_len + len);
+ 	return 0;
+ }
+ 



More information about the lede-commits mailing list