diff --git a/sys/kern/uipc_sockbuf.c b/sys/kern/uipc_sockbuf.c --- a/sys/kern/uipc_sockbuf.c +++ b/sys/kern/uipc_sockbuf.c @@ -75,6 +75,7 @@ struct mbuf *n); #endif static struct mbuf *sbcut_internal(struct sockbuf *sb, int len); +static void sbunreserve_locked(struct socket *so, sb_which which); /* * Our own version of m_clrprotoflags(), that can preserve M_NOTREADY. @@ -618,7 +619,7 @@ SOCK_SENDBUF_UNLOCK(so); return (0); bad2: - sbrelease_locked(so, SO_SND); + sbunreserve_locked(so, SO_SND); bad: SOCK_RECVBUF_UNLOCK(so); SOCK_SENDBUF_UNLOCK(so); @@ -683,6 +684,18 @@ return (sbreserve_locked_limit(so, which, cc, sb_max, td)); } +static void +sbunreserve_locked(struct socket *so, sb_which which) +{ + struct sockbuf *sb = sobuf(so, which); + + SOCK_BUF_LOCK_ASSERT(so, which); + + (void)chgsbsize(so->so_cred->cr_uidinfo, &sb->sb_hiwat, 0, + RLIM_INFINITY); + sb->sb_mbmax = 0; +} + int sbsetopt(struct socket *so, struct sockopt *sopt) { @@ -786,9 +799,7 @@ SOCK_BUF_LOCK_ASSERT(so, which); sbflush_locked(sb); - (void)chgsbsize(so->so_cred->cr_uidinfo, &sb->sb_hiwat, 0, - RLIM_INFINITY); - sb->sb_mbmax = 0; + sbunreserve_locked(so, which); } void