From 09df718e0e96b21e3df2f8bab13e88e0211b074a Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Tue, 2 Aug 2005 17:52:52 +0000 Subject: [PATCH] When allocating link layer ifnet address list entries in ifp->if_resolvemulti(), do so with M_NOWAIT rather than M_WAITOK, so that a mutex can be held over the call. In the FDDI code, add a missing M_ZERO. Consumers are already aware that if_resolvemulti() can fail. MFC after: 1 week --- sys/net/if_arcsubr.c | 8 ++++++-- sys/net/if_ethersubr.c | 8 ++++++-- sys/net/if_fddisubr.c | 8 ++++++-- sys/net/if_iso88025subr.c | 8 ++++++-- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/sys/net/if_arcsubr.c b/sys/net/if_arcsubr.c index e944f495a4f4..09a672ff3604 100644 --- a/sys/net/if_arcsubr.c +++ b/sys/net/if_arcsubr.c @@ -798,7 +798,9 @@ arc_resolvemulti(ifp, llsa, sa) if (!IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) return EADDRNOTAVAIL; MALLOC(sdl, struct sockaddr_dl *, sizeof *sdl, M_IFMADDR, - M_ZERO); + M_NOWAIT | M_ZERO); + if (sdl == NULL) + return ENOMEM; sdl->sdl_len = sizeof *sdl; sdl->sdl_family = AF_LINK; sdl->sdl_index = ifp->if_index; @@ -824,7 +826,9 @@ arc_resolvemulti(ifp, llsa, sa) if (!IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) return EADDRNOTAVAIL; MALLOC(sdl, struct sockaddr_dl *, sizeof *sdl, M_IFMADDR, - M_ZERO); + M_NOWAIT | M_ZERO); + if (sdl == NULL) + return ENOMEM; sdl->sdl_len = sizeof *sdl; sdl->sdl_family = AF_LINK; sdl->sdl_index = ifp->if_index; diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c index 21afd9577756..d2423a495e96 100644 --- a/sys/net/if_ethersubr.c +++ b/sys/net/if_ethersubr.c @@ -1144,7 +1144,9 @@ ether_resolvemulti(struct ifnet *ifp, struct sockaddr **llsa, if (!IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) return EADDRNOTAVAIL; MALLOC(sdl, struct sockaddr_dl *, sizeof *sdl, M_IFMADDR, - M_WAITOK|M_ZERO); + M_NOWAIT|M_ZERO); + if (sdl == NULL) + return ENOMEM; sdl->sdl_len = sizeof *sdl; sdl->sdl_family = AF_LINK; sdl->sdl_index = ifp->if_index; @@ -1171,7 +1173,9 @@ ether_resolvemulti(struct ifnet *ifp, struct sockaddr **llsa, if (!IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) return EADDRNOTAVAIL; MALLOC(sdl, struct sockaddr_dl *, sizeof *sdl, M_IFMADDR, - M_WAITOK|M_ZERO); + M_NOWAIT|M_ZERO); + if (sdl == NULL) + return (ENOMEM); sdl->sdl_len = sizeof *sdl; sdl->sdl_family = AF_LINK; sdl->sdl_index = ifp->if_index; diff --git a/sys/net/if_fddisubr.c b/sys/net/if_fddisubr.c index dd6b4513bcc1..4c626f21c2d5 100644 --- a/sys/net/if_fddisubr.c +++ b/sys/net/if_fddisubr.c @@ -720,7 +720,9 @@ fddi_resolvemulti(ifp, llsa, sa) if (!IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) return (EADDRNOTAVAIL); MALLOC(sdl, struct sockaddr_dl *, sizeof *sdl, M_IFMADDR, - M_WAITOK); + M_NOWAIT | M_ZERO); + if (sdl == NULL) + return (ENOMEM); sdl->sdl_len = sizeof *sdl; sdl->sdl_family = AF_LINK; sdl->sdl_index = ifp->if_index; @@ -749,7 +751,9 @@ fddi_resolvemulti(ifp, llsa, sa) if (!IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) return (EADDRNOTAVAIL); MALLOC(sdl, struct sockaddr_dl *, sizeof *sdl, M_IFMADDR, - M_WAITOK); + M_NOWAIT | M_ZERO); + if (sdl == NULL) + return (ENOMEM); sdl->sdl_len = sizeof *sdl; sdl->sdl_family = AF_LINK; sdl->sdl_index = ifp->if_index; diff --git a/sys/net/if_iso88025subr.c b/sys/net/if_iso88025subr.c index d497143b1df7..fd04bc16ada6 100644 --- a/sys/net/if_iso88025subr.c +++ b/sys/net/if_iso88025subr.c @@ -720,7 +720,9 @@ iso88025_resolvemulti (ifp, llsa, sa) return (EADDRNOTAVAIL); } MALLOC(sdl, struct sockaddr_dl *, sizeof *sdl, M_IFMADDR, - M_WAITOK|M_ZERO); + M_NOWAIT|M_ZERO); + if (sdl == NULL) + return (ENOMEM); sdl->sdl_len = sizeof *sdl; sdl->sdl_family = AF_LINK; sdl->sdl_index = ifp->if_index; @@ -748,7 +750,9 @@ iso88025_resolvemulti (ifp, llsa, sa) return (EADDRNOTAVAIL); } MALLOC(sdl, struct sockaddr_dl *, sizeof *sdl, M_IFMADDR, - M_WAITOK|M_ZERO); + M_NOWAIT|M_ZERO); + if (sdl == NULL) + return (ENOMEM); sdl->sdl_len = sizeof *sdl; sdl->sdl_family = AF_LINK; sdl->sdl_index = ifp->if_index;