[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    Re: [PATCH] libnetlink: fix alignment of netlink messages
From:       Denys Vlasenko <vda.linux () googlemail ! com>
Date:       2016-09-18 20:59:45
Message-ID: CAK1hOcNu4gJjhgF3i_F7LBcXTH42Y8eGWFLKQx=RB+cYwD9JSA () mail ! gmail ! com
[Download RAW message or body]

Applied, thanks

On Fri, Sep 16, 2016 at 10:40 PM, Hauke Mehrtens <hauke@hauke-m.de> wrote:
> 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@hauke-m.de>
> ---
> networking/libiproute/libnetlink.c | 16 ++++++++--------
> 1 file changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/networking/libiproute/libnetlink.c \
> b/networking/libiproute/libnetlink.c index 9d5c641..7e0ff1b 100644
> --- a/networking/libiproute/libnetlink.c
> +++ b/networking/libiproute/libnetlink.c
> @@ -340,14 +340,14 @@ int FAST_FUNC addattr32(struct nlmsghdr *n, int maxlen, int \
> type, uint32_t data) 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;
> }
> 
> @@ -356,14 +356,14 @@ int FAST_FUNC addattr_l(struct nlmsghdr *n, int maxlen, int \
> type, void *data, in 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;
> }
> 
> @@ -372,14 +372,14 @@ int FAST_FUNC rta_addattr32(struct rtattr *rta, int maxlen, \
> int type, uint32_t d 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;
> }
> 
> @@ -388,14 +388,14 @@ int FAST_FUNC rta_addattr_l(struct rtattr *rta, int maxlen, \
> int type, void *data 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;
> }
> 
> --
> 2.9.3
> 
> _______________________________________________
> busybox mailing list
> busybox@busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic