On Sun, 10 Dec 2017 11:25:50 +0000, Martin Pieuchot wrote:
> On 08/12/17(Fri) 12:58, kshe wrote:
> > I noticed one instance where the size given to free(9) can easily be
> > determined.
>
> What about the other free(9)s in the same function?
Somehow I did not immediately realize that rtm_report() would simply
store the allocated length in rtm->rtm_msglen. Now that I do, here is
an updated diff dealing with the remaining calls (along with some more
unrelated whitespace fixes).
Index: rtsock.c
===================================================================
RCS file: /cvs/src/sys/net/rtsock.c,v
retrieving revision 1.256
diff -u -p -r1.256 rtsock.c
--- rtsock.c 10 Dec 2017 11:25:18 -0000 1.256
+++ rtsock.c 11 Dec 2017 07:27:49 -0000
@@ -697,17 +697,18 @@ route_output(struct mbuf *m, struct sock
* Validate RTM_PROPOSAL and pass it along or error out.
*/
if (rtm->rtm_type == RTM_PROPOSAL) {
- if (rtm_validate_proposal(&info) == -1) {
+ if (rtm_validate_proposal(&info) == -1) {
error = EINVAL;
goto fail;
- }
+ }
} else {
error = rtm_output(rtm, &rt, &info, prio, tableid);
if (!error) {
type = rtm->rtm_type;
seq = rtm->rtm_seq;
- free(rtm, M_RTABLE, 0);
+ free(rtm, M_RTABLE, len);
rtm = rtm_report(rt, type, seq, tableid);
+ len = rtm->rtm_msglen;
}
}
@@ -725,18 +726,18 @@ route_output(struct mbuf *m, struct sock
if (route_cb.any_count <= 1) {
/* no other listener and no loopback of messages */
fail:
- free(rtm, M_RTABLE, 0);
+ free(rtm, M_RTABLE, len);
m_freem(m);
return (error);
}
}
if (rtm) {
- if (m_copyback(m, 0, rtm->rtm_msglen, rtm, M_NOWAIT)) {
+ if (m_copyback(m, 0, len, rtm, M_NOWAIT)) {
m_freem(m);
m = NULL;
- } else if (m->m_pkthdr.len > rtm->rtm_msglen)
- m_adj(m, rtm->rtm_msglen - m->m_pkthdr.len);
- free(rtm, M_RTABLE, 0);
+ } else if (m->m_pkthdr.len > len)
+ m_adj(m, len - m->m_pkthdr.len);
+ free(rtm, M_RTABLE, len);
}
if (m)
route_input(m, so, info.rti_info[RTAX_DST] ?
@@ -1161,7 +1162,7 @@ route_cleargateway(struct rtentry *rt, v
if (ISSET(rt->rt_flags, RTF_GATEWAY) && rt->rt_gwroute == nhrt &&
!ISSET(rt->rt_locks, RTV_MTU))
- rt->rt_mtu = 0;
+ rt->rt_mtu = 0;
return (0);
}
@@ -1485,7 +1486,7 @@ void
rtm_addr(struct rtentry *rt, int cmd, struct ifaddr *ifa)
{
struct ifnet *ifp = ifa->ifa_ifp;
- struct mbuf *m = NULL;
+ struct mbuf *m;
struct rt_addrinfo info;
struct ifa_msghdr *ifam;
Regards,
kshe