summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authoritojun <itojun@openbsd.org>2000-02-07 06:08:04 +0000
committeritojun <itojun@openbsd.org>2000-02-07 06:08:04 +0000
commita78cf6d1fc3ca34a4ef6cd0a2ac23996c3404bc6 (patch)
tree0eb7a3c4cc3ee78f58b71c4d840bed62b7db56be /sys
parentremove prefix information in the kernel when all matching in6_ifaddr are gone. (diff)
downloadwireguard-openbsd-a78cf6d1fc3ca34a4ef6cd0a2ac23996c3404bc6.tar.xz
wireguard-openbsd-a78cf6d1fc3ca34a4ef6cd0a2ac23996c3404bc6.zip
make more check about mbuf len before rolling message for routing header.
Diffstat (limited to 'sys')
-rw-r--r--sys/net/rtsock.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c
index 57303703912..6df1c2b2613 100644
--- a/sys/net/rtsock.c
+++ b/sys/net/rtsock.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rtsock.c,v 1.8 1999/12/08 06:50:18 itojun Exp $ */
+/* $OpenBSD: rtsock.c,v 1.9 2000/02/07 06:08:04 itojun Exp $ */
/* $NetBSD: rtsock.c,v 1.18 1996/03/29 00:32:10 cgd Exp $ */
/*
@@ -593,9 +593,6 @@ rt_msg1(type, rtinfo)
register struct sockaddr *sa;
int len, dlen;
- m = m_gethdr(M_DONTWAIT, MT_DATA);
- if (m == 0)
- return (m);
switch (type) {
case RTM_DELADDR:
@@ -610,8 +607,18 @@ rt_msg1(type, rtinfo)
default:
len = sizeof(struct rt_msghdr);
}
- if (len > MHLEN)
+ if (len > MCLBYTES)
panic("rt_msg1");
+ m = m_gethdr(M_DONTWAIT, MT_DATA);
+ if (m && len > MHLEN) {
+ MCLGET(m, M_DONTWAIT);
+ if ((m->m_flags & M_EXT) == 0) {
+ m_free(m);
+ m = NULL;
+ }
+ }
+ if (m == 0)
+ return (m);
m->m_pkthdr.len = m->m_len = len;
m->m_pkthdr.rcvif = 0;
rtm = mtod(m, struct rt_msghdr *);