|
@@ -0,0 +1,100 @@
|
|
|
+From a843f09a4d4428cf11ca02307e60058251b05743 Mon Sep 17 00:00:00 2001
|
|
|
+From: Hauke Mehrtens <[email protected]>
|
|
|
+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 <[email protected]>
|
|
|
+---
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+
|