On Sun, Jun 09, 2019 at 02:37:51PM -0300, Martin Pieuchot wrote:
> Add free(9) sizes and use mallocaray(9) where applicable for multicast
> data structures.
>
> Ok?
OK semarie@
> Index: net/if_pfsync.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_pfsync.c,v
> retrieving revision 1.263
> diff -u -p -r1.263 if_pfsync.c
> --- net/if_pfsync.c 4 Jun 2019 23:00:43 -0000 1.263
> +++ net/if_pfsync.c 9 Jun 2019 17:27:31 -0000
> @@ -328,9 +328,8 @@ pfsync_clone_create(struct if_clone *ifc
> sc->sc_len = PFSYNC_MINPKT;
> sc->sc_maxupdates = 128;
>
> - sc->sc_imo.imo_membership = (struct in_multi **)malloc(
> - (sizeof(struct in_multi *) * IP_MIN_MEMBERSHIPS), M_IPMOPTS,
> - M_WAITOK | M_ZERO);
> + sc->sc_imo.imo_membership = mallocarray(IP_MIN_MEMBERSHIPS,
> + sizeof(struct in_multi *), M_IPMOPTS, M_WAITOK|M_ZERO);
> sc->sc_imo.imo_max_memberships = IP_MIN_MEMBERSHIPS;
>
> ifp = &sc->sc_if;
> @@ -407,7 +406,8 @@ pfsync_clone_destroy(struct ifnet *ifp)
> NET_UNLOCK();
>
> pool_destroy(&sc->sc_pool);
> - free(sc->sc_imo.imo_membership, M_IPMOPTS, 0);
> + free(sc->sc_imo.imo_membership, M_IPMOPTS,
> + sc->sc_imo.imo_max_memberships * sizeof(struct in_multi *));
> free(sc, M_DEVBUF, sizeof(*sc));
>
> return (0);
> Index: net/if_vxlan.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_vxlan.c,v
> retrieving revision 1.72
> diff -u -p -r1.72 if_vxlan.c
> --- net/if_vxlan.c 28 Apr 2019 22:15:58 -0000 1.72
> +++ net/if_vxlan.c 9 Jun 2019 17:27:38 -0000
> @@ -131,9 +131,8 @@ vxlan_clone_create(struct if_clone *ifc,
> struct vxlan_softc *sc;
>
> sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK|M_ZERO);
> - sc->sc_imo.imo_membership = malloc(
> - (sizeof(struct in_multi *) * IP_MIN_MEMBERSHIPS), M_IPMOPTS,
> - M_WAITOK|M_ZERO);
> + sc->sc_imo.imo_membership = mallocarray(IP_MIN_MEMBERSHIPS,
> + sizeof(struct in_multi *), M_IPMOPTS, M_WAITOK|M_ZERO);
> sc->sc_imo.imo_max_memberships = IP_MIN_MEMBERSHIPS;
> sc->sc_dstport = htons(VXLAN_PORT);
> sc->sc_vnetid = VXLAN_VNI_UNSET;
> @@ -199,7 +198,8 @@ vxlan_clone_destroy(struct ifnet *ifp)
> if (!task_del(net_tq(ifp->if_index), &sc->sc_sendtask))
> taskq_barrier(net_tq(ifp->if_index));
>
> - free(sc->sc_imo.imo_membership, M_IPMOPTS, 0);
> + free(sc->sc_imo.imo_membership, M_IPMOPTS,
> + sc->sc_imo.imo_max_memberships * sizeof(struct in_multi *));
> free(sc, M_DEVBUF, sizeof(*sc));
>
> return (0);
> Index: netinet/ip_carp.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_carp.c,v
> retrieving revision 1.337
> diff -u -p -r1.337 ip_carp.c
> --- netinet/ip_carp.c 23 Apr 2019 10:53:45 -0000 1.337
> +++ netinet/ip_carp.c 9 Jun 2019 17:27:45 -0000
> @@ -814,9 +814,8 @@ carp_clone_create(struct if_clone *ifc,
> #ifdef INET6
> sc->sc_im6o.im6o_hlim = CARP_DFLTTL;
> #endif /* INET6 */
> - sc->sc_imo.imo_membership = (struct in_multi **)malloc(
> - (sizeof(struct in_multi *) * IP_MIN_MEMBERSHIPS), M_IPMOPTS,
> - M_WAITOK|M_ZERO);
> + sc->sc_imo.imo_membership = mallocarray(IP_MIN_MEMBERSHIPS,
> + sizeof(struct in_multi *), M_IPMOPTS, M_WAITOK|M_ZERO);
> sc->sc_imo.imo_max_memberships = IP_MIN_MEMBERSHIPS;
>
> LIST_INIT(&sc->carp_mc_listhead);
> @@ -901,7 +900,8 @@ carp_clone_destroy(struct ifnet *ifp)
> if_detach(ifp);
> carp_destroy_vhosts(ifp->if_softc);
> refcnt_finalize(&sc->sc_refcnt, "carpdtor");
> - free(sc->sc_imo.imo_membership, M_IPMOPTS, 0);
> + free(sc->sc_imo.imo_membership, M_IPMOPTS,
> + sc->sc_imo.imo_max_memberships * sizeof(struct in_multi *));
> free(sc, M_DEVBUF, sizeof(*sc));
> return (0);
> }
> Index: netinet/ip_output.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_output.c,v
> retrieving revision 1.354
> diff -u -p -r1.354 ip_output.c
> --- netinet/ip_output.c 28 Apr 2019 22:15:58 -0000 1.354
> +++ netinet/ip_output.c 9 Jun 2019 17:28:23 -0000
> @@ -1362,8 +1362,7 @@ ip_setmoptions(int optname, struct ip_mo
> * allocate one and initialize to default values.
> */
> imo = malloc(sizeof(*imo), M_IPMOPTS, M_WAITOK|M_ZERO);
> - immp = (struct in_multi **)malloc(
> - (sizeof(*immp) * IP_MIN_MEMBERSHIPS), M_IPMOPTS,
> + immp = mallocarray(IP_MIN_MEMBERSHIPS, sizeof(*immp), M_IPMOPTS,
> M_WAITOK|M_ZERO);
> *imop = imo;
> imo->imo_ifidx = 0;
> @@ -1517,9 +1516,8 @@ ip_setmoptions(int optname, struct ip_mo
> omships = imo->imo_membership;
> newmax = ((imo->imo_max_memberships + 1) * 2) - 1;
> if (newmax <= IP_MAX_MEMBERSHIPS) {
> - nmships = (struct in_multi **)mallocarray(
> - newmax, sizeof(*nmships), M_IPMOPTS,
> - M_NOWAIT|M_ZERO);
> + nmships = mallocarray(newmax, sizeof(*nmships),
> + M_IPMOPTS, M_NOWAIT|M_ZERO);
> if (nmships != NULL) {
> memcpy(nmships, omships,
> sizeof(*omships) *
> @@ -1623,7 +1621,8 @@ ip_setmoptions(int optname, struct ip_mo
> imo->imo_ttl == IP_DEFAULT_MULTICAST_TTL &&
> imo->imo_loop == IP_DEFAULT_MULTICAST_LOOP &&
> imo->imo_num_memberships == 0) {
> - free(imo->imo_membership , M_IPMOPTS, 0);
> + free(imo->imo_membership , M_IPMOPTS,
> + imo->imo_max_memberships * sizeof(struct in_multi *));
> free(*imop, M_IPMOPTS, sizeof(**imop));
> *imop = NULL;
> }
> @@ -1688,7 +1687,8 @@ ip_freemoptions(struct ip_moptions *imo)
> if (imo != NULL) {
> for (i = 0; i < imo->imo_num_memberships; ++i)
> in_delmulti(imo->imo_membership[i]);
> - free(imo->imo_membership, M_IPMOPTS, 0);
> + free(imo->imo_membership, M_IPMOPTS,
> + imo->imo_max_memberships * sizeof(struct in_multi *));
> free(imo, M_IPMOPTS, sizeof(*imo));
> }
> }
> Index: netinet6/ip6_output.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/ip6_output.c,v
> retrieving revision 1.243
> diff -u -p -r1.243 ip6_output.c
> --- netinet6/ip6_output.c 28 Apr 2019 22:15:58 -0000 1.243
> +++ netinet6/ip6_output.c 9 Jun 2019 17:35:15 -0000
> @@ -1882,9 +1882,7 @@ ip6_setmoptions(int optname, struct ip6_
> * No multicast option buffer attached to the pcb;
> * allocate one and initialize to default values.
> */
> - im6o = (struct ip6_moptions *)
> - malloc(sizeof(*im6o), M_IPMOPTS, M_WAITOK);
> -
> + im6o = malloc(sizeof(*im6o), M_IPMOPTS, M_WAITOK);
> if (im6o == NULL)
> return (ENOBUFS);
> *im6op = im6o;
> @@ -2138,7 +2136,7 @@ ip6_setmoptions(int optname, struct ip6_
> im6o->im6o_hlim == ip6_defmcasthlim &&
> im6o->im6o_loop == IPV6_DEFAULT_MULTICAST_LOOP &&
> LIST_EMPTY(&im6o->im6o_memberships)) {
> - free(*im6op, M_IPMOPTS, 0);
> + free(*im6op, M_IPMOPTS, sizeof(*im6o));
> *im6op = NULL;
> }
>
> @@ -2202,7 +2200,7 @@ ip6_freemoptions(struct ip6_moptions *im
> LIST_REMOVE(imm, i6mm_chain);
> in6_leavegroup(imm);
> }
> - free(im6o, M_IPMOPTS, 0);
> + free(im6o, M_IPMOPTS, sizeof(*im6o));
> }
>
> /*
>
--
Sebastien Marie