From ba4e3dbeb6d69e701232833facef45f419aa3cb6 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Thu, 22 Apr 2004 04:35:45 +0000 Subject: [PATCH] M_NOWAIT to mostly M_INTWAIT conversions, with a splattering of M_NULLOK to prevent exhaustion attacks from crashing the system. Note in patricular that the MALLOC tseg_qent for the tcp reassembly queue went from M_NOWAIT to M_INTWAIT | M_NULLOK. --- sys/netinet/igmp.c | 4 ++-- sys/netinet/in.c | 10 ++-------- sys/netinet/in_pcb.c | 4 ++-- sys/netinet/ip_encap.c | 8 +++----- sys/netinet/ip_flow.c | 10 ++++------ sys/netinet/tcp_input.c | 6 +++--- sys/netinet/tcp_syncache.c | 4 ++-- 7 files changed, 18 insertions(+), 28 deletions(-) diff --git a/sys/netinet/igmp.c b/sys/netinet/igmp.c index 765173eee2..6b696eb342 100644 --- a/sys/netinet/igmp.c +++ b/sys/netinet/igmp.c @@ -36,7 +36,7 @@ * * @(#)igmp.c 8.1 (Berkeley) 7/19/93 * $FreeBSD: src/sys/netinet/igmp.c,v 1.29.2.2 2003/01/23 21:06:44 sam Exp $ - * $DragonFly: src/sys/netinet/igmp.c,v 1.6 2004/02/14 21:12:39 dillon Exp $ + * $DragonFly: src/sys/netinet/igmp.c,v 1.7 2004/04/22 04:35:45 dillon Exp $ */ /* @@ -135,7 +135,7 @@ find_rti(ifp) } rti = rti->rti_next; } - MALLOC(rti, struct router_info *, sizeof *rti, M_IGMP, M_NOWAIT); + MALLOC(rti, struct router_info *, sizeof *rti, M_IGMP, M_INTWAIT); rti->rti_ifp = ifp; rti->rti_type = IGMP_V2_ROUTER; rti->rti_time = 0; diff --git a/sys/netinet/in.c b/sys/netinet/in.c index 1f80ccd869..fb79e626e4 100644 --- a/sys/netinet/in.c +++ b/sys/netinet/in.c @@ -32,7 +32,7 @@ * * @(#)in.c 8.4 (Berkeley) 1/9/95 * $FreeBSD: src/sys/netinet/in.c,v 1.44.2.14 2002/11/08 00:45:50 suz Exp $ - * $DragonFly: src/sys/netinet/in.c,v 1.9 2004/03/23 22:19:07 hsu Exp $ + * $DragonFly: src/sys/netinet/in.c,v 1.10 2004/04/22 04:35:45 dillon Exp $ */ #include "opt_bootp.h" @@ -853,13 +853,7 @@ in_addmulti(ap, ifp) /* XXX - if_addmulti uses M_WAITOK. Can this really be called at interrupt time? If so, need to fix if_addmulti. XXX */ - inm = (struct in_multi *)malloc(sizeof(*inm), M_IPMADDR, M_NOWAIT); - if (inm == NULL) { - splx(s); - return (NULL); - } - - bzero(inm, sizeof *inm); + inm = malloc(sizeof(*inm), M_IPMADDR, M_WAITOK | M_ZERO); inm->inm_addr = *ap; inm->inm_ifp = ifp; inm->inm_ifma = ifma; diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c index 121658b0aa..ba87fd8dc0 100644 --- a/sys/netinet/in_pcb.c +++ b/sys/netinet/in_pcb.c @@ -33,7 +33,7 @@ * * @(#)in_pcb.c 8.4 (Berkeley) 5/24/95 * $FreeBSD: src/sys/netinet/in_pcb.c,v 1.59.2.27 2004/01/02 04:06:42 ambrisko Exp $ - * $DragonFly: src/sys/netinet/in_pcb.c,v 1.18 2004/04/18 20:05:09 hsu Exp $ + * $DragonFly: src/sys/netinet/in_pcb.c,v 1.19 2004/04/22 04:35:45 dillon Exp $ */ #include "opt_ipsec.h" @@ -976,7 +976,7 @@ in_pcbinsporthash(struct inpcb *inp) /* If none exists, malloc one and tack it on. */ if (phd == NULL) { MALLOC(phd, struct inpcbport *, sizeof(struct inpcbport), - M_PCB, M_NOWAIT); + M_PCB, M_INTWAIT | M_NULLOK); if (phd == NULL) return (ENOBUFS); /* XXX */ phd->phd_port = inp->inp_lport; diff --git a/sys/netinet/ip_encap.c b/sys/netinet/ip_encap.c index 22d83f00f1..65abc1e5d7 100644 --- a/sys/netinet/ip_encap.c +++ b/sys/netinet/ip_encap.c @@ -1,5 +1,5 @@ /* $FreeBSD: src/sys/netinet/ip_encap.c,v 1.1.2.5 2003/01/23 21:06:45 sam Exp $ */ -/* $DragonFly: src/sys/netinet/ip_encap.c,v 1.4 2003/08/23 11:18:00 rob Exp $ */ +/* $DragonFly: src/sys/netinet/ip_encap.c,v 1.5 2004/04/22 04:35:45 dillon Exp $ */ /* $KAME: ip_encap.c,v 1.41 2001/03/15 08:35:08 itojun Exp $ */ /* @@ -344,12 +344,11 @@ encap_attach(af, proto, sp, sm, dp, dm, psw, arg) goto fail; } - ep = malloc(sizeof(*ep), M_NETADDR, M_NOWAIT); /*XXX*/ + ep = malloc(sizeof(*ep), M_NETADDR, M_INTWAIT | M_ZERO | M_NULLOK); if (ep == NULL) { error = ENOBUFS; goto fail; } - bzero(ep, sizeof(*ep)); ep->af = af; ep->proto = proto; @@ -390,12 +389,11 @@ encap_attach_func(af, proto, func, psw, arg) goto fail; } - ep = malloc(sizeof(*ep), M_NETADDR, M_NOWAIT); /*XXX*/ + ep = malloc(sizeof(*ep), M_NETADDR, INTWAIT | M_ZERO | M_NULLOK); if (ep == NULL) { error = ENOBUFS; goto fail; } - bzero(ep, sizeof(*ep)); ep->af = af; ep->proto = proto; diff --git a/sys/netinet/ip_flow.c b/sys/netinet/ip_flow.c index d5e1459696..d9e3c357c4 100644 --- a/sys/netinet/ip_flow.c +++ b/sys/netinet/ip_flow.c @@ -34,7 +34,7 @@ * POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/netinet/ip_flow.c,v 1.9.2.2 2001/11/04 17:35:31 luigi Exp $ - * $DragonFly: src/sys/netinet/ip_flow.c,v 1.2 2003/06/17 04:28:51 dillon Exp $ + * $DragonFly: src/sys/netinet/ip_flow.c,v 1.3 2004/04/22 04:35:45 dillon Exp $ */ #include @@ -274,9 +274,7 @@ ipflow_slowtimo( } void -ipflow_create( - const struct route *ro, - struct mbuf *m) +ipflow_create(const struct route *ro, struct mbuf *m) { const struct ip *const ip = mtod(m, struct ip *); struct ipflow *ipf; @@ -298,8 +296,8 @@ ipflow_create( if (ipflow_inuse == IPFLOW_MAX) { ipf = ipflow_reap(); } else { - ipf = (struct ipflow *) malloc(sizeof(*ipf), M_IPFLOW, - M_NOWAIT); + ipf = malloc(sizeof(*ipf), M_IPFLOW, + M_INTWAIT | M_NULLOK); if (ipf == NULL) return; ipflow_inuse++; diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c index 33d8b47b44..ab697ccf77 100644 --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -33,7 +33,7 @@ * * @(#)tcp_input.c 8.12 (Berkeley) 5/24/95 * $FreeBSD: src/sys/netinet/tcp_input.c,v 1.107.2.38 2003/05/21 04:46:41 cjc Exp $ - * $DragonFly: src/sys/netinet/tcp_input.c,v 1.25 2004/04/13 05:23:13 dillon Exp $ + * $DragonFly: src/sys/netinet/tcp_input.c,v 1.26 2004/04/22 04:35:45 dillon Exp $ */ #include "opt_ipfw.h" /* for ipfw_fwd */ @@ -226,9 +226,9 @@ tcp_reass(tp, th, tlenp, m) return (0); } - /* Allocate a new queue entry. If we can't, just drop the pkt. XXX */ + /* Allocate a new queue entry. */ MALLOC(te, struct tseg_qent *, sizeof(struct tseg_qent), M_TSEGQ, - M_NOWAIT); + M_INTWAIT | M_NULLOK); if (te == NULL) { tcpstat.tcps_rcvmemdrop++; m_freem(m); diff --git a/sys/netinet/tcp_syncache.c b/sys/netinet/tcp_syncache.c index 810ea44df4..14ae9ebdb5 100644 --- a/sys/netinet/tcp_syncache.c +++ b/sys/netinet/tcp_syncache.c @@ -32,7 +32,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/netinet/tcp_syncache.c,v 1.5.2.14 2003/02/24 04:02:27 silby Exp $ - * $DragonFly: src/sys/netinet/tcp_syncache.c,v 1.11 2004/03/04 01:02:05 hsu Exp $ + * $DragonFly: src/sys/netinet/tcp_syncache.c,v 1.12 2004/04/22 04:35:45 dillon Exp $ */ #include "opt_inet6.h" @@ -599,7 +599,7 @@ syncache_socket(sc, lso) inp->inp_flags |= oinp->inp_flags & INP_CONTROLOPTS; if (oinp->in6p_outputopts) inp->in6p_outputopts = - ip6_copypktopts(oinp->in6p_outputopts, M_NOWAIT); + ip6_copypktopts(oinp->in6p_outputopts, M_INTWAIT); inp->in6p_route = sc->sc_route6; sc->sc_route6.ro_rt = NULL; -- 2.41.0