aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2022-11-02 17:05:14 +0000
committerMark Johnston <markj@FreeBSD.org>2024-01-22 18:45:03 +0000
commit0ea32f0e83769ca1c6ebc40fb0a3a0e64a24e7a0 (patch)
tree3c7e0a8fb04e14e0d55699de690748987319f18c
parent3e27fcf057937ef93258dc4f8e67a308e02f349c (diff)
inpcb: Remove a PCB from its LB group upon a subsequent error
If a memory allocation failure causes bind to fail, we should take the inpcb back out of its LB group since it's not prepared to handle connections. Reviewed by: glebius MFC after: 2 weeks Sponsored by: Modirum MDPay Sponsored by: Klara, Inc. Differential Revision: https://reviews.freebsd.org/D37027 (cherry picked from commit a152dd863418638c3eb08b5c101b10b82f8072f5)
-rw-r--r--sys/netinet/in_pcb.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c
index 3f4ad6752aae..3f8db305d3c9 100644
--- a/sys/netinet/in_pcb.c
+++ b/sys/netinet/in_pcb.c
@@ -2646,7 +2646,6 @@ in_pcbinshash_internal(struct inpcb *inp, struct mbuf *m)
struct inpcbinfo *pcbinfo = inp->inp_pcbinfo;
struct inpcbport *phd;
u_int32_t hashkey_faddr;
- int so_options;
INP_WLOCK_ASSERT(inp);
INP_HASH_WLOCK_ASSERT(pcbinfo);
@@ -2671,13 +2670,10 @@ in_pcbinshash_internal(struct inpcb *inp, struct mbuf *m)
* Add entry to load balance group.
* Only do this if SO_REUSEPORT_LB is set.
*/
- so_options = inp_so_options(inp);
- if (so_options & SO_REUSEPORT_LB) {
- int ret = in_pcbinslbgrouphash(inp, M_NODOM);
- if (ret) {
- /* pcb lb group malloc fail (ret=ENOBUFS). */
- return (ret);
- }
+ if ((inp->inp_flags2 & INP_REUSEPORT_LB) != 0) {
+ int error = in_pcbinslbgrouphash(inp, M_NODOM);
+ if (error != 0)
+ return (error);
}
/*
@@ -2687,13 +2683,16 @@ in_pcbinshash_internal(struct inpcb *inp, struct mbuf *m)
if (phd->phd_port == inp->inp_lport)
break;
}
+
/*
* If none exists, malloc one and tack it on.
*/
if (phd == NULL) {
phd = malloc(sizeof(struct inpcbport), M_PCB, M_NOWAIT);
if (phd == NULL) {
- return (ENOBUFS); /* XXX */
+ if ((inp->inp_flags2 & INP_REUSEPORT_LB) != 0)
+ in_pcbremlbgrouphash(inp);
+ return (ENOMEM);
}
bzero(&phd->phd_epoch_ctx, sizeof(struct epoch_context));
phd->phd_port = inp->inp_lport;