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

Reply via email to