diff --git a/sys/net/rtsock_shared.c b/sys/net/rtsock_shared.c index e12879c80d21..828d664ce03e 100644 --- a/sys/net/rtsock_shared.c +++ b/sys/net/rtsock_shared.c @@ -213,7 +213,7 @@ COMPATNAME(route_filter)(struct mbuf *m, struct sockproto *proto, struct rawcb *rp) { struct routecb *rop = (struct routecb *)rp; - struct rt_xmsghdr *rtm; + struct rt_xmsghdr rtm; KASSERT(m != NULL); KASSERT(proto != NULL); @@ -229,18 +229,19 @@ COMPATNAME(route_filter)(struct mbuf *m, struct sockproto *proto, /* Ensure we can access rtm_type */ if (m->m_len < - offsetof(struct rt_xmsghdr, rtm_type) + sizeof(rtm->rtm_type)) + offsetof(struct rt_xmsghdr, rtm_type) + sizeof(rtm.rtm_type)) return EINVAL; - rtm = mtod(m, struct rt_xmsghdr *); - if (rtm->rtm_type >= sizeof(rop->rocb_msgfilter) * CHAR_BIT) + m_copydata(m, offsetof(struct rt_xmsghdr, rtm_type), + sizeof(rtm.rtm_type), &rtm.rtm_type); + if (rtm.rtm_type >= sizeof(rop->rocb_msgfilter) * CHAR_BIT) return EINVAL; /* If the rtm type is filtered out, return a positive. */ if (rop->rocb_msgfilter != 0 && - !(rop->rocb_msgfilter & RTMSGFILTER(rtm->rtm_type))) + !(rop->rocb_msgfilter & RTMSGFILTER(rtm.rtm_type))) return EEXIST; - if (rop->rocb_missfilterlen != 0 && rtm->rtm_type == RTM_MISS) { + if (rop->rocb_missfilterlen != 0 && rtm.rtm_type == RTM_MISS) { __CTASSERT(RTAX_DST == 0); struct sockaddr_storage ss; struct sockaddr *dst = (struct sockaddr *)&ss, *sa; @@ -248,16 +249,16 @@ COMPATNAME(route_filter)(struct mbuf *m, struct sockproto *proto, char *ep = cp + rop->rocb_missfilterlen; /* Ensure we can access sa_len */ - if (m->m_pkthdr.len < sizeof(*rtm) + _SA_MINSIZE) + if (m->m_pkthdr.len < sizeof(rtm) + _SA_MINSIZE) return EINVAL; - m_copydata(m, sizeof(*rtm) + offsetof(struct sockaddr, sa_len), + m_copydata(m, sizeof(rtm) + offsetof(struct sockaddr, sa_len), sizeof(ss.ss_len), &ss.ss_len); if (ss.ss_len < _SA_MINSIZE || ss.ss_len > sizeof(ss) || - m->m_pkthdr.len < sizeof(*rtm) + ss.ss_len) + m->m_pkthdr.len < sizeof(rtm) + ss.ss_len) return EINVAL; /* Copy out the destination sockaddr */ - m_copydata(m, sizeof(*rtm), ss.ss_len, &ss); + m_copydata(m, sizeof(rtm), ss.ss_len, &ss); /* Find a matching sockaddr in the filter */ while (cp < ep) {