diff options
author | melifaro <melifaro@FreeBSD.org> | 2014-04-27 10:43:48 +0000 |
---|---|---|
committer | melifaro <melifaro@FreeBSD.org> | 2014-04-27 10:43:48 +0000 |
commit | c5479b1c51e46a4e9c407c20e8ec65a986a5c556 (patch) | |
tree | 187a226d8825a378ffc2c1862eae5c2315f276c7 /sys/net/rtsock.c | |
parent | 29b944e3ac72c69f6553f9950cc0f778d84237c3 (diff) | |
download | FreeBSD-src-c5479b1c51e46a4e9c407c20e8ec65a986a5c556.zip FreeBSD-src-c5479b1c51e46a4e9c407c20e8ec65a986a5c556.tar.gz |
Remove useless zeroing of RTAX_DST on error.
Cleanup a bit.
MFC after: 1 month
Diffstat (limited to 'sys/net/rtsock.c')
-rw-r--r-- | sys/net/rtsock.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index 674f81d..ecb31a6 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -542,32 +542,38 @@ route_output(struct mbuf *m, struct socket *so) panic("route_output"); len = m->m_pkthdr.len; if (len < sizeof(*rtm) || - len != mtod(m, struct rt_msghdr *)->rtm_msglen) { - info.rti_info[RTAX_DST] = NULL; + len != mtod(m, struct rt_msghdr *)->rtm_msglen) senderr(EINVAL); - } + R_Malloc(rtm, struct rt_msghdr *, len); - if (rtm == NULL) { - info.rti_info[RTAX_DST] = NULL; + if (rtm == NULL) senderr(ENOBUFS); - } m_copydata(m, 0, len, (caddr_t)rtm); + bzero(&info, sizeof(info)); + if (rtm->rtm_version != RTM_VERSION) { - info.rti_info[RTAX_DST] = NULL; + /* Do not touch message since format is unknown */ + Free(rtm); + rtm = NULL; senderr(EPROTONOSUPPORT); } + + /* + * Starting from here, it is possible + * to alter original message and insert + * caller PID and error value. + */ + rtm->rtm_pid = curproc->p_pid; - bzero(&info, sizeof(info)); info.rti_addrs = rtm->rtm_addrs; /* * rt_xaddrs() performs s6_addr[2] := sin6_scope_id for AF_INET6 * link-local address because rtrequest requires addresses with * embedded scope id. */ - if (rt_xaddrs((caddr_t)(rtm + 1), len + (caddr_t)rtm, &info)) { - info.rti_info[RTAX_DST] = NULL; + if (rt_xaddrs((caddr_t)(rtm + 1), len + (caddr_t)rtm, &info)) senderr(EINVAL); - } + info.rti_flags = rtm->rtm_flags; if (info.rti_info[RTAX_DST] == NULL || info.rti_info[RTAX_DST]->sa_family >= AF_MAX || |