From a494b2492c039ab957abbf74398e0642c72787c0 Mon Sep 17 00:00:00 2001
From: Jonathan McDowell <noodles@earth.li>
Date: Wed, 6 Jun 2018 18:30:56 +0100
Subject: [PATCH] Fix alignment when parsing Netlink messages

The Netlink header should be treated as NLA_HDRLEN in length, and
NLA_ALIGN() used to deal with padding after attributes.
---
 mqtt-arp.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/mqtt-arp.c b/mqtt-arp.c
index 19da330..ba977b4 100644
--- a/mqtt-arp.c
+++ b/mqtt-arp.c
@@ -197,15 +197,15 @@ void main_loop(struct ma_config *config, struct mosquitto *mosq, int sock)
 					nd->ndm_type);
 			}
 			attr = (struct nlattr *) (nd + 1);
-			while (attr->nla_len > 0) {
-				data = (((uint8_t *) attr) + 4);
+			while (((uint8_t *) attr - buf) < hdr->nlmsg_len) {
+				data = (((uint8_t *) attr) + NLA_HDRLEN);
 				if (attr->nla_type == NDA_LLADDR &&
 					nd->ndm_state == NUD_REACHABLE) {
 					mqtt_mac_presence(config, mosq,
 							data, true);
 				}
-				attr = (struct nlattr *)
-					(((uint8_t *) attr) + attr->nla_len);
+				attr = (struct nlattr *) (((uint8_t *) attr) +
+						NLA_ALIGN(attr->nla_len));
 			}
 			break;
 		case RTM_DELNEIGH:
-- 
2.39.5