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
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, ...},
		"\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, ...},
		"\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, ...},
		"\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>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
			
			
This commit is contained in:
		
				
					committed by
					
						 Denys Vlasenko
						Denys Vlasenko
					
				
			
			
				
	
			
			
			
						parent
						
							0ae0509679
						
					
				
				
					commit
					4ff86df861
				
			| @@ -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; | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user