System calls should not fail due to temporary memory shortage in
authorbluhm <bluhm@openbsd.org>
Mon, 3 Oct 2022 16:43:52 +0000 (16:43 +0000)
committerbluhm <bluhm@openbsd.org>
Mon, 3 Oct 2022 16:43:52 +0000 (16:43 +0000)
malloc(9) or pool_get(9).
Pass down a wait flag to pru_attach().  During syscall socket(2)
it is ok to wait, this logic was missing for internet pcb.  Pfkey
and route sockets were already waiting.
sonewconn() must not wait when called during TCP 3-way handshake.
This logic has been preserved.  Unix domain stream socket connect(2)
can wait until the other side has created the socket to accept.
OK mvs@

24 files changed:
sys/kern/uipc_socket.c
sys/kern/uipc_socket2.c
sys/kern/uipc_usrreq.c
sys/net/pfkeyv2.c
sys/net/rtsock.c
sys/netinet/in_pcb.c
sys/netinet/in_pcb.h
sys/netinet/ip_divert.c
sys/netinet/ip_divert.h
sys/netinet/ip_var.h
sys/netinet/raw_ip.c
sys/netinet/tcp_input.c
sys/netinet/tcp_subr.c
sys/netinet/tcp_usrreq.c
sys/netinet/tcp_var.h
sys/netinet/udp_usrreq.c
sys/netinet/udp_var.h
sys/netinet6/ip6_divert.c
sys/netinet6/ip6_divert.h
sys/netinet6/ip6_var.h
sys/netinet6/raw_ip6.c
sys/sys/protosw.h
sys/sys/socketvar.h
sys/sys/unpcb.h

index 05e6eb5..4787635 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: uipc_socket.c,v 1.289 2022/09/05 14:56:08 bluhm Exp $ */
+/*     $OpenBSD: uipc_socket.c,v 1.290 2022/10/03 16:43:52 bluhm Exp $ */
 /*     $NetBSD: uipc_socket.c,v 1.21 1996/02/04 02:17:52 christos Exp $        */
 
 /*
@@ -138,11 +138,12 @@ soinit(void)
 }
 
 struct socket *
-soalloc(int prflags)
+soalloc(int wait)
 {
        struct socket *so;
 
-       so = pool_get(&socket_pool, prflags);
+       so = pool_get(&socket_pool, (wait == M_WAIT ? PR_WAITOK : PR_NOWAIT) |
+           PR_ZERO);
        if (so == NULL)
                return (NULL);
        rw_init_flags(&so->so_lock, "solock", RWL_DUPOK);
@@ -174,7 +175,7 @@ socreate(int dom, struct socket **aso, int type, int proto)
                return (EPROTONOSUPPORT);
        if (prp->pr_type != type)
                return (EPROTOTYPE);
-       so = soalloc(PR_WAITOK | PR_ZERO);
+       so = soalloc(M_WAIT);
        klist_init(&so->so_rcv.sb_sel.si_note, &socket_klistops, so);
        klist_init(&so->so_snd.sb_sel.si_note, &socket_klistops, so);
        sigio_init(&so->so_sigio);
@@ -193,7 +194,7 @@ socreate(int dom, struct socket **aso, int type, int proto)
        so->so_rcv.sb_timeo_nsecs = INFSLP;
 
        solock(so);
-       error = pru_attach(so, proto);
+       error = pru_attach(so, proto, M_WAIT);
        if (error) {
                so->so_state |= SS_NOFDREF;
                /* sofree() calls sounlock(). */
index 3658537..d8b39e4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: uipc_socket2.c,v 1.128 2022/09/05 14:56:09 bluhm Exp $        */
+/*     $OpenBSD: uipc_socket2.c,v 1.129 2022/10/03 16:43:52 bluhm Exp $        */
 /*     $NetBSD: uipc_socket2.c,v 1.11 1996/02/04 02:17:55 christos Exp $       */
 
 /*
@@ -168,7 +168,7 @@ soisdisconnected(struct socket *so)
  * Connstatus may be 0 or SS_ISCONNECTED.
  */
 struct socket *
-sonewconn(struct socket *head, int connstatus)
+sonewconn(struct socket *head, int connstatus, int wait)
 {
        struct socket *so;
        int persocket = solock_persocket(head);
@@ -185,7 +185,7 @@ sonewconn(struct socket *head, int connstatus)
                return (NULL);
        if (head->so_qlen + head->so_q0len > head->so_qlimit * 3)
                return (NULL);
-       so = soalloc(PR_NOWAIT | PR_ZERO);
+       so = soalloc(wait);
        if (so == NULL)
                return (NULL);
        so->so_type = head->so_type;
@@ -238,7 +238,7 @@ sonewconn(struct socket *head, int connstatus)
                sounlock(head);
        }
 
-       error = pru_attach(so, 0);
+       error = pru_attach(so, 0, wait);
 
        if (persocket) {
                sounlock(so);
index ddd8479..bf5d83b 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: uipc_usrreq.c,v 1.189 2022/09/20 10:10:11 mvs Exp $   */
+/*     $OpenBSD: uipc_usrreq.c,v 1.190 2022/10/03 16:43:52 bluhm Exp $ */
 /*     $NetBSD: uipc_usrreq.c,v 1.18 1996/02/09 19:00:50 christos Exp $        */
 
 /*
@@ -242,7 +242,7 @@ const struct sysctl_bounded_args unpdgctl_vars[] = {
 };
 
 int
-uipc_attach(struct socket *so, int proto)
+uipc_attach(struct socket *so, int proto, int wait)
 {
        struct unpcb *unp;
        int error;
@@ -270,7 +270,8 @@ uipc_attach(struct socket *so, int proto)
                if (error)
                        return (error);
        }
-       unp = pool_get(&unpcb_pool, PR_NOWAIT|PR_ZERO);
+       unp = pool_get(&unpcb_pool, (wait == M_WAIT ? PR_WAITOK : PR_NOWAIT) |
+           PR_ZERO);
        if (unp == NULL)
                return (ENOBUFS);
        refcnt_init(&unp->unp_refcnt);
@@ -839,7 +840,7 @@ unp_connect(struct socket *so, struct mbuf *nam, struct proc *p)
                solock(so2);
 
                if ((so2->so_options & SO_ACCEPTCONN) == 0 ||
-                   (so3 = sonewconn(so2, 0)) == NULL) {
+                   (so3 = sonewconn(so2, 0, M_WAIT)) == NULL) {
                        error = ECONNREFUSED;
                }
 
index b8f123a..022bd5a 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: pfkeyv2.c,v 1.252 2022/09/03 22:43:38 mvs Exp $ */
+/* $OpenBSD: pfkeyv2.c,v 1.253 2022/10/03 16:43:52 bluhm Exp $ */
 
 /*
  *     @(#)COPYRIGHT   1.1 (NRL) 17 January 1995
@@ -169,7 +169,7 @@ static int npromisc = 0;
 
 void pfkey_init(void);
 
-int pfkeyv2_attach(struct socket *, int);
+int pfkeyv2_attach(struct socket *, int, int);
 int pfkeyv2_detach(struct socket *);
 int pfkeyv2_disconnect(struct socket *);
 int pfkeyv2_shutdown(struct socket *);
@@ -269,7 +269,7 @@ pfkey_init(void)
  * Attach a new PF_KEYv2 socket.
  */
 int
-pfkeyv2_attach(struct socket *so, int proto)
+pfkeyv2_attach(struct socket *so, int proto, int wait)
 {
        struct pkpcb *kp;
        int error;
@@ -281,7 +281,10 @@ pfkeyv2_attach(struct socket *so, int proto)
        if (error)
                return (error);
 
-       kp = pool_get(&pkpcb_pool, PR_WAITOK|PR_ZERO);
+       kp = pool_get(&pkpcb_pool, (wait == M_WAIT ? PR_WAITOK : PR_NOWAIT) |
+           PR_ZERO);
+       if (kp == NULL)
+               return (ENOBUFS);
        so->so_pcb = kp;
        refcnt_init(&kp->kcb_refcnt);
        kp->kcb_socket = so;
index 8da8026..1abd013 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: rtsock.c,v 1.356 2022/09/13 09:05:47 mvs Exp $        */
+/*     $OpenBSD: rtsock.c,v 1.357 2022/10/03 16:43:52 bluhm Exp $      */
 /*     $NetBSD: rtsock.c,v 1.18 1996/03/29 00:32:10 cgd Exp $  */
 
 /*
@@ -111,7 +111,7 @@ void        rcb_ref(void *, void *);
 void   rcb_unref(void *, void *);
 int    route_output(struct mbuf *, struct socket *);
 int    route_ctloutput(int, struct socket *, int, int, struct mbuf *);
-int    route_attach(struct socket *, int);
+int    route_attach(struct socket *, int, int);
 int    route_detach(struct socket *);
 int    route_disconnect(struct socket *);
 int    route_shutdown(struct socket *);
@@ -216,7 +216,7 @@ rcb_unref(void *null, void *v)
 }
 
 int
-route_attach(struct socket *so, int proto)
+route_attach(struct socket *so, int proto, int wait)
 {
        struct rtpcb    *rop;
        int              error;
@@ -229,7 +229,10 @@ route_attach(struct socket *so, int proto)
         * code does not care about the additional fields
         * and works directly on the raw socket.
         */
-       rop = pool_get(&rtpcb_pool, PR_WAITOK|PR_ZERO);
+       rop = pool_get(&rtpcb_pool, (wait == M_WAIT ? PR_WAITOK : PR_NOWAIT) |
+           PR_ZERO);
+       if (rop == NULL)
+               return (ENOBUFS);
        so->so_pcb = rop;
        /* Init the timeout structure */
        timeout_set_proc(&rop->rop_timeout, rtm_senddesync_timer, so);
index e7d5987..acc9a06 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: in_pcb.c,v 1.275 2022/09/03 22:43:38 mvs Exp $        */
+/*     $OpenBSD: in_pcb.c,v 1.276 2022/10/03 16:43:52 bluhm Exp $      */
 /*     $NetBSD: in_pcb.c,v 1.25 1996/02/13 23:41:53 christos Exp $     */
 
 /*
@@ -226,11 +226,12 @@ in_rootonly(u_int16_t port, u_int16_t proto)
 }
 
 int
-in_pcballoc(struct socket *so, struct inpcbtable *table)
+in_pcballoc(struct socket *so, struct inpcbtable *table, int wait)
 {
        struct inpcb *inp;
 
-       inp = pool_get(&inpcb_pool, PR_NOWAIT|PR_ZERO);
+       inp = pool_get(&inpcb_pool, (wait == M_WAIT ? PR_WAITOK : PR_NOWAIT) |
+           PR_ZERO);
        if (inp == NULL)
                return (ENOBUFS);
        inp->inp_table = table;
index a89a963..fd88778 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: in_pcb.h,v 1.134 2022/09/03 22:43:38 mvs Exp $        */
+/*     $OpenBSD: in_pcb.h,v 1.135 2022/10/03 16:43:52 bluhm Exp $      */
 /*     $NetBSD: in_pcb.h,v 1.14 1996/02/13 23:42:00 christos Exp $     */
 
 /*
@@ -277,7 +277,7 @@ extern int in_pcbnotifymiss;
 
 void    in_init(void);
 void    in_losing(struct inpcb *);
-int     in_pcballoc(struct socket *, struct inpcbtable *);
+int     in_pcballoc(struct socket *, struct inpcbtable *, int);
 int     in_pcbbind(struct inpcb *, struct mbuf *, struct proc *);
 int     in_pcbaddrisavail(struct inpcb *, struct sockaddr_in *, int,
            struct proc *);
index 1cdad66..9d48677 100644 (file)
@@ -1,4 +1,4 @@
-/*      $OpenBSD: ip_divert.c,v 1.87 2022/09/05 14:56:09 bluhm Exp $ */
+/*      $OpenBSD: ip_divert.c,v 1.88 2022/10/03 16:43:52 bluhm Exp $ */
 
 /*
  * Copyright (c) 2009 Michele Marchetto <michele@openbsd.org>
@@ -255,7 +255,7 @@ divert_packet(struct mbuf *m, int dir, u_int16_t divert_port)
 }
 
 int
-divert_attach(struct socket *so, int proto)
+divert_attach(struct socket *so, int proto, int wait)
 {
        int error;
 
@@ -264,7 +264,7 @@ divert_attach(struct socket *so, int proto)
        if ((so->so_state & SS_PRIV) == 0)
                return EACCES;
 
-       error = in_pcballoc(so, &divbtable);
+       error = in_pcballoc(so, &divbtable, wait);
        if (error)
                return error;
 
index 5055a8f..098e424 100644 (file)
@@ -1,4 +1,4 @@
-/*      $OpenBSD: ip_divert.h,v 1.22 2022/09/05 14:56:09 bluhm Exp $ */
+/*      $OpenBSD: ip_divert.h,v 1.23 2022/10/03 16:43:52 bluhm Exp $ */
 
 /*
  * Copyright (c) 2009 Michele Marchetto <michele@openbsd.org>
@@ -70,7 +70,7 @@ extern const struct pr_usrreqs divert_usrreqs;
 void    divert_init(void);
 void    divert_packet(struct mbuf *, int, u_int16_t);
 int     divert_sysctl(int *, u_int, void *, size_t *, void *, size_t);
-int     divert_attach(struct socket *, int);
+int     divert_attach(struct socket *, int, int);
 int     divert_detach(struct socket *);
 void    divert_lock(struct socket *);
 void    divert_unlock(struct socket *);
index 49b2f67..3f90bbc 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ip_var.h,v 1.105 2022/09/13 09:05:02 mvs Exp $        */
+/*     $OpenBSD: ip_var.h,v 1.106 2022/10/03 16:43:52 bluhm Exp $      */
 /*     $NetBSD: ip_var.h,v 1.16 1996/02/13 23:43:20 christos Exp $     */
 
 /*
@@ -256,7 +256,7 @@ void         rip_init(void);
 int     rip_input(struct mbuf **, int *, int, int);
 int     rip_output(struct mbuf *, struct socket *, struct sockaddr *,
            struct mbuf *);
-int     rip_attach(struct socket *, int);
+int     rip_attach(struct socket *, int, int);
 int     rip_detach(struct socket *);
 void    rip_lock(struct socket *);
 void    rip_unlock(struct socket *);
index a00d922..68e5a44 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: raw_ip.c,v 1.148 2022/09/13 09:05:02 mvs Exp $        */
+/*     $OpenBSD: raw_ip.c,v 1.149 2022/10/03 16:43:52 bluhm Exp $      */
 /*     $NetBSD: raw_ip.c,v 1.25 1996/02/18 18:58:33 christos Exp $     */
 
 /*
@@ -468,7 +468,7 @@ u_long      rip_sendspace = RIPSNDQ;
 u_long rip_recvspace = RIPRCVQ;
 
 int
-rip_attach(struct socket *so, int proto)
+rip_attach(struct socket *so, int proto, int wait)
 {
        struct inpcb *inp;
        int error;
@@ -483,7 +483,7 @@ rip_attach(struct socket *so, int proto)
        if ((error = soreserve(so, rip_sendspace, rip_recvspace)))
                return error;
        NET_ASSERT_LOCKED();
-       if ((error = in_pcballoc(so, &rawcbtable)))
+       if ((error = in_pcballoc(so, &rawcbtable, wait)))
                return error;
        inp = sotoinpcb(so);
        inp->inp_ip.ip_p = proto;
index a37da1d..3ec2bfc 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: tcp_input.c,v 1.380 2022/09/03 19:22:19 bluhm Exp $   */
+/*     $OpenBSD: tcp_input.c,v 1.381 2022/10/03 16:43:52 bluhm Exp $   */
 /*     $NetBSD: tcp_input.c,v 1.23 1996/02/13 23:43:44 christos Exp $  */
 
 /*
@@ -3505,7 +3505,7 @@ syn_cache_get(struct sockaddr *src, struct sockaddr *dst, struct tcphdr *th,
         * the connection, abort it.
         */
        oso = so;
-       so = sonewconn(so, SS_ISCONNECTED);
+       so = sonewconn(so, SS_ISCONNECTED, M_DONTWAIT);
        if (so == NULL)
                goto resetandabort;
 
index e79aa0f..3a0d0cd 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: tcp_subr.c,v 1.188 2022/09/03 22:11:09 bluhm Exp $    */
+/*     $OpenBSD: tcp_subr.c,v 1.189 2022/10/03 16:43:52 bluhm Exp $    */
 /*     $NetBSD: tcp_subr.c,v 1.22 1996/02/13 23:44:00 christos Exp $   */
 
 /*
@@ -420,12 +420,13 @@ tcp_respond(struct tcpcb *tp, caddr_t template, struct tcphdr *th0,
  * protocol control block.
  */
 struct tcpcb *
-tcp_newtcpcb(struct inpcb *inp)
+tcp_newtcpcb(struct inpcb *inp, int wait)
 {
        struct tcpcb *tp;
        int i;
 
-       tp = pool_get(&tcpcb_pool, PR_NOWAIT|PR_ZERO);
+       tp = pool_get(&tcpcb_pool, (wait == M_WAIT ? PR_WAITOK : PR_NOWAIT) |
+           PR_ZERO);
        if (tp == NULL)
                return (NULL);
        TAILQ_INIT(&tp->t_segq);
index 7968aac..85083ee 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: tcp_usrreq.c,v 1.208 2022/09/13 09:05:47 mvs Exp $    */
+/*     $OpenBSD: tcp_usrreq.c,v 1.209 2022/10/03 16:43:52 bluhm Exp $  */
 /*     $NetBSD: tcp_usrreq.c,v 1.20 1996/02/13 23:44:16 christos Exp $ */
 
 /*
@@ -460,7 +460,7 @@ tcp_ctloutput(int op, struct socket *so, int level, int optname,
  * buffer space, and entering LISTEN state to accept connections.
  */
 int
-tcp_attach(struct socket *so, int proto)
+tcp_attach(struct socket *so, int proto, int wait)
 {
        struct tcpcb *tp;
        struct inpcb *inp;
@@ -477,11 +477,11 @@ tcp_attach(struct socket *so, int proto)
        }
 
        NET_ASSERT_LOCKED();
-       error = in_pcballoc(so, &tcbtable);
+       error = in_pcballoc(so, &tcbtable, wait);
        if (error)
                return (error);
        inp = sotoinpcb(so);
-       tp = tcp_newtcpcb(inp);
+       tp = tcp_newtcpcb(inp, wait);
        if (tp == NULL) {
                unsigned int nofd = so->so_state & SS_NOFDREF;  /* XXX */
 
index 7939cb3..430bc56 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: tcp_var.h,v 1.158 2022/09/13 09:05:47 mvs Exp $       */
+/*     $OpenBSD: tcp_var.h,v 1.159 2022/10/03 16:43:52 bluhm Exp $     */
 /*     $NetBSD: tcp_var.h,v 1.17 1996/02/13 23:44:24 christos Exp $    */
 
 /*
@@ -696,7 +696,7 @@ void        tcp6_mtudisc(struct inpcb *, int);
 void   tcp6_mtudisc_callback(struct sockaddr_in6 *, u_int);
 #endif
 struct tcpcb *
-        tcp_newtcpcb(struct inpcb *);
+        tcp_newtcpcb(struct inpcb *, int);
 void    tcp_notify(struct inpcb *, int);
 int     tcp_output(struct tcpcb *);
 void    tcp_pulloutofband(struct socket *, u_int, struct mbuf *, int);
@@ -717,7 +717,7 @@ void         tcp_trace(short, short, struct tcpcb *, struct tcpcb *, caddr_t,
 struct tcpcb *
         tcp_usrclosed(struct tcpcb *);
 int     tcp_sysctl(int *, u_int, void *, size_t *, void *, size_t);
-int     tcp_attach(struct socket *, int);
+int     tcp_attach(struct socket *, int, int);
 int     tcp_detach(struct socket *);
 int     tcp_bind(struct socket *, struct mbuf *, struct proc *);
 int     tcp_listen(struct socket *);
index a019b2c..1b7aa82 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: udp_usrreq.c,v 1.302 2022/09/05 14:56:09 bluhm Exp $  */
+/*     $OpenBSD: udp_usrreq.c,v 1.303 2022/10/03 16:43:52 bluhm Exp $  */
 /*     $NetBSD: udp_usrreq.c,v 1.28 1996/03/16 23:54:03 christos Exp $ */
 
 /*
@@ -1079,7 +1079,7 @@ release:
 }
 
 int
-udp_attach(struct socket *so, int proto)
+udp_attach(struct socket *so, int proto, int wait)
 {
        int error;
 
@@ -1090,7 +1090,7 @@ udp_attach(struct socket *so, int proto)
                return error;
 
        NET_ASSERT_LOCKED();
-       if ((error = in_pcballoc(so, &udbtable)))
+       if ((error = in_pcballoc(so, &udbtable, wait)))
                return error;
 #ifdef INET6
        if (sotoinpcb(so)->inp_flags & INP_IPV6)
index c086640..bfe0723 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: udp_var.h,v 1.47 2022/09/05 14:56:09 bluhm Exp $      */
+/*     $OpenBSD: udp_var.h,v 1.48 2022/10/03 16:43:52 bluhm Exp $      */
 /*     $NetBSD: udp_var.h,v 1.12 1996/02/13 23:44:41 christos Exp $    */
 
 /*
@@ -143,7 +143,7 @@ int  udp6_output(struct inpcb *, struct mbuf *, struct mbuf *,
        struct mbuf *);
 #endif /* INET6 */
 int     udp_sysctl(int *, u_int, void *, size_t *, void *, size_t);
-int     udp_attach(struct socket *, int);
+int     udp_attach(struct socket *, int, int);
 int     udp_detach(struct socket *);
 void    udp_lock(struct socket *);
 void    udp_unlock(struct socket *);
index 29b3afb..daea9b9 100644 (file)
@@ -1,4 +1,4 @@
-/*      $OpenBSD: ip6_divert.c,v 1.86 2022/09/05 14:56:09 bluhm Exp $ */
+/*      $OpenBSD: ip6_divert.c,v 1.87 2022/10/03 16:43:52 bluhm Exp $ */
 
 /*
  * Copyright (c) 2009 Michele Marchetto <michele@openbsd.org>
@@ -261,7 +261,7 @@ divert6_packet(struct mbuf *m, int dir, u_int16_t divert_port)
 }
 
 int
-divert6_attach(struct socket *so, int proto)
+divert6_attach(struct socket *so, int proto, int wait)
 {
        int error;
 
@@ -271,7 +271,7 @@ divert6_attach(struct socket *so, int proto)
        if ((so->so_state & SS_PRIV) == 0)
                return EACCES;
 
-       error = in_pcballoc(so, &divb6table);
+       error = in_pcballoc(so, &divb6table, wait);
        if (error)
                return (error);
 
index df0fbcf..d19db21 100644 (file)
@@ -1,4 +1,4 @@
-/*      $OpenBSD: ip6_divert.h,v 1.20 2022/09/05 14:56:09 bluhm Exp $ */
+/*      $OpenBSD: ip6_divert.h,v 1.21 2022/10/03 16:43:52 bluhm Exp $ */
 
 /*
  * Copyright (c) 2009 Michele Marchetto <michele@openbsd.org>
@@ -70,7 +70,7 @@ extern const struct pr_usrreqs divert6_usrreqs;
 void    divert6_init(void);
 void    divert6_packet(struct mbuf *, int, u_int16_t);
 int     divert6_sysctl(int *, u_int, void *, size_t *, void *, size_t);
-int     divert6_attach(struct socket *, int);
+int     divert6_attach(struct socket *, int, int);
 int     divert6_detach(struct socket *);
 void    divert6_lock(struct socket *);
 void    divert6_unlock(struct socket *);
index c3c1d13..7aad901 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ip6_var.h,v 1.103 2022/09/13 09:05:02 mvs Exp $       */
+/*     $OpenBSD: ip6_var.h,v 1.104 2022/10/03 16:43:52 bluhm Exp $     */
 /*     $KAME: ip6_var.h,v 1.33 2000/06/11 14:59:20 jinmei Exp $        */
 
 /*
@@ -351,7 +351,7 @@ void        rip6_ctlinput(int, struct sockaddr *, u_int, void *);
 int    rip6_ctloutput(int, struct socket *, int, int, struct mbuf *);
 int    rip6_output(struct mbuf *, struct socket *, struct sockaddr *,
            struct mbuf *);
-int    rip6_attach(struct socket *, int);
+int    rip6_attach(struct socket *, int, int);
 int    rip6_detach(struct socket *);
 void   rip6_lock(struct socket *);
 void   rip6_unlock(struct socket *);
index b87f83d..cfa2445 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: raw_ip6.c,v 1.169 2022/09/13 09:05:02 mvs Exp $       */
+/*     $OpenBSD: raw_ip6.c,v 1.170 2022/10/03 16:43:52 bluhm Exp $     */
 /*     $KAME: raw_ip6.c,v 1.69 2001/03/04 15:55:44 itojun Exp $        */
 
 /*
@@ -585,7 +585,7 @@ extern      u_long rip6_sendspace;
 extern u_long rip6_recvspace;
 
 int
-rip6_attach(struct socket *so, int proto)
+rip6_attach(struct socket *so, int proto, int wait)
 {
        struct inpcb *in6p;
        int error;
@@ -600,15 +600,15 @@ rip6_attach(struct socket *so, int proto)
        if ((error = soreserve(so, rip6_sendspace, rip6_recvspace)))
                return error;
        NET_ASSERT_LOCKED();
-       if ((error = in_pcballoc(so, &rawin6pcbtable)))
+       if ((error = in_pcballoc(so, &rawin6pcbtable, wait)))
                return error;
 
        in6p = sotoinpcb(so);
        in6p->inp_ipv6.ip6_nxt = proto;
        in6p->inp_cksum6 = -1;
 
-       in6p->inp_icmp6filt = malloc(sizeof(struct icmp6_filter),
-           M_PCB, M_NOWAIT);
+       in6p->inp_icmp6filt = malloc(sizeof(struct icmp6_filter), M_PCB,
+           wait == M_WAIT ? M_WAITOK : M_NOWAIT);
        if (in6p->inp_icmp6filt == NULL) {
                in_pcbdetach(in6p);
                return ENOMEM;
index 00a6c75..3830417 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: protosw.h,v 1.56 2022/09/13 09:05:47 mvs Exp $        */
+/*     $OpenBSD: protosw.h,v 1.57 2022/10/03 16:43:52 bluhm Exp $      */
 /*     $NetBSD: protosw.h,v 1.10 1996/04/09 20:55:32 cgd Exp $ */
 
 /*-
@@ -62,7 +62,7 @@ struct stat;
 struct ifnet;
 
 struct pr_usrreqs {
-       int     (*pru_attach)(struct socket *, int);
+       int     (*pru_attach)(struct socket *, int, int);
        int     (*pru_detach)(struct socket *);
        void    (*pru_lock)(struct socket *);
        void    (*pru_unlock)(struct socket *);
@@ -267,9 +267,9 @@ extern const struct protosw inet6sw[];
 #endif /* INET6 */
 
 static inline int
-pru_attach(struct socket *so, int proto)
+pru_attach(struct socket *so, int proto, int wait)
 {
-       return (*so->so_proto->pr_usrreqs->pru_attach)(so, proto);
+       return (*so->so_proto->pr_usrreqs->pru_attach)(so, proto, wait);
 }
 
 static inline int
index 16f586b..0e90300 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: socketvar.h,v 1.110 2022/09/05 14:56:09 bluhm Exp $   */
+/*     $OpenBSD: socketvar.h,v 1.111 2022/10/03 16:43:52 bluhm Exp $   */
 /*     $NetBSD: socketvar.h,v 1.18 1996/02/09 18:25:38 christos Exp $  */
 
 /*-
@@ -331,7 +331,7 @@ void        soisconnecting(struct socket *);
 void   soisdisconnected(struct socket *);
 void   soisdisconnecting(struct socket *);
 int    solisten(struct socket *, int);
-struct socket *sonewconn(struct socket *, int);
+struct socket *sonewconn(struct socket *, int, int);
 void   soqinsque(struct socket *, struct socket *, int);
 int    soqremque(struct socket *, int);
 int    soreceive(struct socket *, struct mbuf **, struct uio *,
index b4f2681..b0a02c4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: unpcb.h,v 1.41 2022/09/13 09:05:47 mvs Exp $  */
+/*     $OpenBSD: unpcb.h,v 1.42 2022/10/03 16:43:52 bluhm Exp $        */
 /*     $NetBSD: unpcb.h,v 1.6 1994/06/29 06:46:08 cgd Exp $    */
 
 /*
@@ -112,7 +112,7 @@ struct fdpass {
 
 extern const struct pr_usrreqs uipc_usrreqs;
 
-int    uipc_attach(struct socket *, int);
+int    uipc_attach(struct socket *, int, int);
 int    uipc_detach(struct socket *);
 int    uipc_bind(struct socket *, struct mbuf *, struct proc *);
 int    uipc_listen(struct socket *);