Validate msg_controllen, as per RFC2292.
authorSascha Wildner <swildner@dragonflybsd.org>
Tue, 27 Feb 2007 12:05:26 +0000 (12:05 +0000)
committerSascha Wildner <swildner@dragonflybsd.org>
Tue, 27 Feb 2007 12:05:26 +0000 (12:05 +0000)
Submitted-by: Hasso Tepper <hasso@estpak.ee>
sys/sys/socket.h

index f23f338..2bd85c8 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)socket.h    8.4 (Berkeley) 2/21/94
  * $FreeBSD: src/sys/sys/socket.h,v 1.39.2.7 2001/07/03 11:02:01 ume Exp $
- * $DragonFly: src/sys/sys/socket.h,v 1.18 2007/01/18 11:46:32 sephe Exp $
+ * $DragonFly: src/sys/sys/socket.h,v 1.19 2007/02/27 12:05:26 swildner Exp $
  */
 
 #ifndef _SYS_SOCKET_H_
@@ -407,7 +407,14 @@ struct cmsgcred {
            (struct cmsghdr *)NULL : \
            (struct cmsghdr *)((caddr_t)(cmsg) + _ALIGN((cmsg)->cmsg_len)))
 
-#define        CMSG_FIRSTHDR(mhdr)     ((struct cmsghdr *)(mhdr)->msg_control)
+/*
+ * RFC 2292 requires to check msg_controllen, in case that the kernel returns
+ * an empty list for some reasons.
+ */
+#define        CMSG_FIRSTHDR(mhdr) \
+       ((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \
+        (struct cmsghdr *)(mhdr)->msg_control : \
+        (struct cmsghdr *)NULL)
 
 /* RFC 2292 additions */