Browse Source

netlink: Use NLMSG_OK and NLMSG_NEXT macros

Jouni Malinen 15 years ago
parent
commit
f37cf89ccb
2 changed files with 11 additions and 14 deletions
  1. 5 14
      src/drivers/netlink.c
  2. 6 0
      src/drivers/priv_netlink.h

+ 5 - 14
src/drivers/netlink.c

@@ -48,17 +48,10 @@ try_again:
 	}
 
 	h = (struct nlmsghdr *) buf;
-	while (left >= (int) sizeof(*h)) {
-		int len, plen;
-
-		len = h->nlmsg_len;
-		plen = len - sizeof(*h);
-		if (len > left || plen < 0) {
-			wpa_printf(MSG_DEBUG, "netlnk: Malformed message: "
-				   "len=%d left=%d plen=%d",
-				   len, left, plen);
-			break;
-		}
+	while (NLMSG_OK(h, left)) {
+		int plen;
+
+		plen = h->nlmsg_len - sizeof(*h);
 
 		switch (h->nlmsg_type) {
 		case RTM_NEWLINK:
@@ -73,9 +66,7 @@ try_again:
 			break;
 		}
 
-		len = NLMSG_ALIGN(len);
-		left -= len;
-		h = (struct nlmsghdr *) ((char *) h + len);
+		h = NLMSG_NEXT(h, left);
 	}
 
 	if (left > 0) {

+ 6 - 0
src/drivers/priv_netlink.h

@@ -57,6 +57,12 @@
 #define NLMSG_LENGTH(len) ((len) + NLMSG_ALIGN(sizeof(struct nlmsghdr)))
 #define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len))
 #define NLMSG_DATA(nlh) ((void*) (((char*) nlh) + NLMSG_LENGTH(0)))
+#define NLMSG_NEXT(nlh,len) ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \
+			     (struct nlmsghdr *) \
+			     (((char *)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len)))
+#define NLMSG_OK(nlh,len) ((len) >= (int) sizeof(struct nlmsghdr) && \
+			   (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \
+			   (int) (nlh)->nlmsg_len <= (len))
 #define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len)))
 
 #define RTA_ALIGNTO 4