Do soreserve() before `rop' allocation. It doesn't require protocol control block be attached to socket. Also we always call `pr_attach' in thread context so we always have `curproc'.
ok? Index: sys/net/rtsock.c =================================================================== RCS file: /cvs/src/sys/net/rtsock.c,v retrieving revision 1.304 diff -u -p -r1.304 rtsock.c --- sys/net/rtsock.c 7 Nov 2020 09:51:40 -0000 1.304 +++ sys/net/rtsock.c 10 Feb 2021 19:43:52 -0000 @@ -301,6 +301,9 @@ route_attach(struct socket *so, int prot struct rtpcb *rop; int error; + error = soreserve(so, ROUTESNDQ, ROUTERCVQ); + if (error) + return (error); /* * use the rawcb but allocate a rtpcb, this * code does not care about the additional fields @@ -311,15 +314,6 @@ route_attach(struct socket *so, int prot /* Init the timeout structure */ timeout_set(&rop->rop_timeout, rtm_senddesync_timer, so); refcnt_init(&rop->rop_refcnt); - - if (curproc == NULL) - error = EACCES; - else - error = soreserve(so, ROUTESNDQ, ROUTERCVQ); - if (error) { - pool_put(&rtpcb_pool, rop); - return (error); - } rop->rop_socket = so; rop->rop_proto = proto;