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++) {