Module Name:    src
Committed By:   christos
Date:           Sat Dec 25 20:37:45 UTC 2010

Modified Files:
        src/sys/net: rtsock.c

Log Message:
merge the length getting code from rt_msg1 and rt_msg2 and make it fail
when the compatibility ifinfo is missing instead of returning junk.


To generate a diff of this commit:
cvs rdiff -u -r1.131 -r1.132 src/sys/net/rtsock.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/rtsock.c
diff -u src/sys/net/rtsock.c:1.131 src/sys/net/rtsock.c:1.132
--- src/sys/net/rtsock.c:1.131	Fri Nov 12 11:30:26 2010
+++ src/sys/net/rtsock.c	Sat Dec 25 15:37:44 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtsock.c,v 1.131 2010/11/12 16:30:26 roy Exp $	*/
+/*	$NetBSD: rtsock.c,v 1.132 2010/12/25 20:37:44 christos Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.131 2010/11/12 16:30:26 roy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.132 2010/12/25 20:37:44 christos Exp $");
 
 #include "opt_inet.h"
 #include "opt_mpls.h"
@@ -572,58 +572,69 @@
 	return 0;
 }
 
-struct mbuf *
-rt_msg1(int type, struct rt_addrinfo *rtinfo, void *data, int datalen)
+static int
+rt_getlen(int type)
 {
-	struct rt_msghdr *rtm;
-	struct mbuf *m;
-	int i;
-	const struct sockaddr *sa;
-	int len, dlen;
-
-	m = m_gethdr(M_DONTWAIT, MT_DATA);
-	if (m == NULL)
-		return m;
-	MCLAIM(m, &routedomain.dom_mowner);
 	switch (type) {
-
 	case RTM_DELADDR:
 	case RTM_NEWADDR:
 	case RTM_CHGADDR:
-		len = sizeof(struct ifa_msghdr);
-		break;
+		return sizeof(struct ifa_msghdr);
 
-#ifdef COMPAT_14
 	case RTM_OOIFINFO:
-		len = sizeof(struct if_msghdr14);
-		break;
+#ifdef COMPAT_14
+		return sizeof(struct if_msghdr14);
+#else
+#ifdef DIAGNOSTIC
+		printf("RTM_OOIFINFO\n");
+#endif
+		return -1;
 #endif
-#ifdef COMPAT_50
 	case RTM_OIFINFO:
-		len = sizeof(struct if_msghdr50);
-		break;
+#ifdef COMPAT_50
+		return sizeof(struct if_msghdr50);
+#else
+#ifdef DIAGNOSTIC
+		printf("RTM_OIFINFO\n");
+#endif
+		return -1;
 #endif
 
 	case RTM_IFINFO:
-		len = sizeof(struct if_msghdr);
-		break;
+		return sizeof(struct if_msghdr);
 
 	case RTM_IFANNOUNCE:
 	case RTM_IEEE80211:
-		len = sizeof(struct if_announcemsghdr);
-		break;
+		return sizeof(struct if_announcemsghdr);
 
 	default:
-		len = sizeof(struct rt_msghdr);
+		return sizeof(struct rt_msghdr);
 	}
+}
+
+
+struct mbuf *
+rt_msg1(int type, struct rt_addrinfo *rtinfo, void *data, int datalen)
+{
+	struct rt_msghdr *rtm;
+	struct mbuf *m;
+	int i;
+	const struct sockaddr *sa;
+	int len, dlen;
+
+	m = m_gethdr(M_DONTWAIT, MT_DATA);
+	if (m == NULL)
+		return m;
+	MCLAIM(m, &routedomain.dom_mowner);
+
+	if ((len = rt_getlen(type)) == -1)
+		goto out;
 	if (len > MHLEN + MLEN)
 		panic("rt_msg1: message too long");
 	else if (len > MHLEN) {
 		m->m_next = m_get(M_DONTWAIT, MT_DATA);
-		if (m->m_next == NULL) {
-			m_freem(m);
-			return NULL;
-		}
+		if (m->m_next == NULL)
+			goto out;
 		MCLAIM(m->m_next, m->m_owner);
 		m->m_pkthdr.len = len;
 		m->m_len = MHLEN;
@@ -644,14 +655,15 @@
 		m_copyback(m, len, dlen, sa);
 		len += dlen;
 	}
-	if (m->m_pkthdr.len != len) {
-		m_freem(m);
-		return NULL;
-	}
+	if (m->m_pkthdr.len != len)
+		goto out;
 	rtm->rtm_msglen = len;
 	rtm->rtm_version = RTM_VERSION;
 	rtm->rtm_type = type;
 	return m;
+out:
+	m_freem(m);
+	return NULL;
 }
 
 /*
@@ -677,31 +689,9 @@
 
 	rtinfo->rti_addrs = 0;
 again:
-	switch (type) {
-
-	case RTM_DELADDR:
-	case RTM_NEWADDR:
-	case RTM_CHGADDR:
-		len = sizeof(struct ifa_msghdr);
-		break;
-#ifdef COMPAT_14
-	case RTM_OOIFINFO:
-		len = sizeof(struct if_msghdr14);
-		break;
-#endif
-#ifdef COMPAT_50
-	case RTM_OIFINFO:
-		len = sizeof(struct if_msghdr50);
-		break;
-#endif
-
-	case RTM_IFINFO:
-		len = sizeof(struct if_msghdr);
-		break;
+	if ((len = rt_getlen(type)) == -1)
+		return EINVAL;
 
-	default:
-		len = sizeof(struct rt_msghdr);
-	}
 	if ((cp0 = cp) != NULL)
 		cp += len;
 	for (i = 0; i < RTAX_MAX; i++) {

Reply via email to