netlink: Use NLMSG_OK and NLMSG_NEXT macros
authorJouni Malinen <j@w1.fi>
Fri, 18 Dec 2009 15:22:35 +0000 (17:22 +0200)
committerJouni Malinen <j@w1.fi>
Fri, 18 Dec 2009 15:22:35 +0000 (17:22 +0200)
src/drivers/netlink.c
src/drivers/priv_netlink.h

index 5e61183..a788e0b 100644 (file)
@@ -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) {
index 0ab0bb2..23eff83 100644 (file)
 #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