From b965365f8d20a9bf774ad681bea0c1510e0f53aa Mon Sep 17 00:00:00 2001 From: Keith Sklower Date: Fri, 20 Dec 1991 01:43:13 -0800 Subject: [PATCH] reference count ifaddrs to make them safe for deletion SCCS-vsn: sys/netinet/in.c 7.19 SCCS-vsn: sys/netns/ns.c 7.9 SCCS-vsn: sys/netiso/iso.c 7.17 SCCS-vsn: sys/netiso/if_eon.c 7.17 --- usr/src/sys/netinet/in.c | 17 +++++++++-------- usr/src/sys/netiso/if_eon.c | 3 +-- usr/src/sys/netiso/iso.c | 5 ++--- usr/src/sys/netns/ns.c | 16 ++++++++-------- 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/usr/src/sys/netinet/in.c b/usr/src/sys/netinet/in.c index 05f83a7a4b..15194024b6 100644 --- a/usr/src/sys/netinet/in.c +++ b/usr/src/sys/netinet/in.c @@ -4,7 +4,7 @@ * * %sccs.include.redist.c% * - * @(#)in.c 7.18 (Berkeley) %G% + * @(#)in.c 7.19 (Berkeley) %G% */ #include "param.h" @@ -225,7 +225,6 @@ in_control(so, cmd, data, ifp) register struct ifaddr *ifa; struct in_ifaddr *oia; struct in_aliasreq *ifra = (struct in_aliasreq *)data; - struct mbuf *m; struct sockaddr_in oldaddr; int error, hostIsNew, maskIsNew; u_long i; @@ -261,16 +260,18 @@ in_control(so, cmd, data, ifp) if (ifp == 0) panic("in_control"); if (ia == (struct in_ifaddr *)0) { - m = m_getclr(M_WAIT, MT_IFADDR); - if (m == (struct mbuf *)NULL) + oia = (struct in_ifaddr *) + malloc(sizeof *oia, M_IFADDR, M_WAITOK); + if (oia == (struct in_ifaddr *)NULL) return (ENOBUFS); + bzero((caddr_t)oia, sizeof *oia); if (ia = in_ifaddr) { for ( ; ia->ia_next; ia = ia->ia_next) ; - ia->ia_next = mtod(m, struct in_ifaddr *); + ia->ia_next = oia; } else - in_ifaddr = mtod(m, struct in_ifaddr *); - ia = mtod(m, struct in_ifaddr *); + in_ifaddr = oia; + ia = oia; if (ifa = ifp->if_addrlist) { for ( ; ifa->ifa_next; ifa = ifa->ifa_next) ; @@ -423,7 +424,7 @@ in_control(so, cmd, data, ifp) else printf("Didn't unlink inifadr from list\n"); } - (void) m_free(dtom(oia)); + IFAFREE((&oia->ia_ifa)); break; default: diff --git a/usr/src/sys/netiso/if_eon.c b/usr/src/sys/netiso/if_eon.c index 82bcd194b2..71a8888784 100644 --- a/usr/src/sys/netiso/if_eon.c +++ b/usr/src/sys/netiso/if_eon.c @@ -4,7 +4,7 @@ * * %sccs.include.redist.c% * - * @(#)if_eon.c 7.16 (Berkeley) %G% + * @(#)if_eon.c 7.17 (Berkeley) %G% */ /*********************************************************** @@ -171,7 +171,6 @@ eonioctl(ifp, cmd, data) ifp->if_flags |= IFF_UP; if (ifa->ifa_addr->sa_family != AF_LINK) ifa->ifa_rtrequest = eonrtrequest; - ifa->ifa_llinfolen = sizeof(struct eon_llinfo); } break; } diff --git a/usr/src/sys/netiso/iso.c b/usr/src/sys/netiso/iso.c index 51e04c750d..cffb978625 100644 --- a/usr/src/sys/netiso/iso.c +++ b/usr/src/sys/netiso/iso.c @@ -4,7 +4,7 @@ * * %sccs.include.redist.c% * - * @(#)iso.c 7.16 (Berkeley) %G% + * @(#)iso.c 7.17 (Berkeley) %G% */ /*********************************************************** @@ -547,7 +547,7 @@ iso_control(so, cmd, data, ifp) else printf("Didn't unlink isoifadr from list\n"); } - free((caddr_t)oia, M_IFADDR); + IFAFREE((&oia->ia_ifa)); break; default: @@ -614,7 +614,6 @@ iso_ifinit(ifp, ia, siso, scrub) if (ifp->if_output == ether_output) { ia->ia_ifa.ifa_rtrequest = llc_rtrequest; ia->ia_ifa.ifa_flags |= RTF_CLONING; - ia->ia_ifa.ifa_llinfolen = sizeof(struct llinfo_llc); } /* * Add route for the network. diff --git a/usr/src/sys/netns/ns.c b/usr/src/sys/netns/ns.c index d39b679e5c..b3d2d2ef78 100644 --- a/usr/src/sys/netns/ns.c +++ b/usr/src/sys/netns/ns.c @@ -4,7 +4,7 @@ * * %sccs.include.redist.c% * - * @(#)ns.c 7.8 (Berkeley) %G% + * @(#)ns.c 7.9 (Berkeley) %G% */ #include "param.h" @@ -44,7 +44,6 @@ ns_control(so, cmd, data, ifp) register struct ns_ifaddr *ia; struct ifaddr *ifa; struct ns_ifaddr *oia; - struct mbuf *m; int error, dstIsNew, hostIsNew; /* @@ -102,16 +101,17 @@ ns_control(so, cmd, data, ifp) case SIOCSIFADDR: case SIOCSIFDSTADDR: if (ia == (struct ns_ifaddr *)0) { - m = m_getclr(M_WAIT, MT_IFADDR); - if (m == (struct mbuf *)NULL) + oia = (struct ns_ifaddr *) + malloc(sizeof *ia, M_IFADDR, M_WAITOK); + if (oia == (struct ns_ifaddr *)NULL) return (ENOBUFS); if (ia = ns_ifaddr) { for ( ; ia->ia_next; ia = ia->ia_next) ; - ia->ia_next = mtod(m, struct ns_ifaddr *); + ia->ia_next = oia; } else - ns_ifaddr = mtod(m, struct ns_ifaddr *); - ia = mtod(m, struct ns_ifaddr *); + ns_ifaddr = oia; + ia = oia; if (ifa = ifp->if_addrlist) { for ( ; ifa->ifa_next; ifa = ifa->ifa_next) ; @@ -182,7 +182,7 @@ ns_control(so, cmd, data, ifp) else printf("Didn't unlink nsifadr from list\n"); } - (void) m_free(dtom(oia)); + IFAFREE((&oia->ia_ifa)); if (0 == --ns_interfaces) { /* * We reset to virginity and start all over again -- 2.20.1