aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet
diff options
context:
space:
mode:
authorRandall Stewart <rrs@FreeBSD.org>2020-07-31 10:03:32 +0000
committerRandall Stewart <rrs@FreeBSD.org>2020-07-31 10:03:32 +0000
commit8315f1ea26626b1b2c814c35032944bca8615fa8 (patch)
tree3f4740c518d0a7d2bc35de83fb6990539f64be42 /sys/netinet
parentd6391a26d6395586558cbd54958c8393162d5ca1 (diff)
Notes
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/tcp_subr.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index 777fd7200ccd5..bf4b413bd4de1 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -1713,6 +1713,7 @@ tcp_newtcpcb(struct inpcb *inp)
if (CC_ALGO(tp)->cb_init(tp->ccv) > 0) {
if (tp->t_fb->tfb_tcp_fb_fini)
(*tp->t_fb->tfb_tcp_fb_fini)(tp, 1);
+ in_pcbrele_wlocked(inp);
refcount_release(&tp->t_fb->tfb_refcnt);
uma_zfree(V_tcpcb_zone, tm);
return (NULL);
@@ -1723,6 +1724,7 @@ tcp_newtcpcb(struct inpcb *inp)
if (khelp_init_osd(HELPER_CLASS_TCP, tp->osd)) {
if (tp->t_fb->tfb_tcp_fb_fini)
(*tp->t_fb->tfb_tcp_fb_fini)(tp, 1);
+ in_pcbrele_wlocked(inp);
refcount_release(&tp->t_fb->tfb_refcnt);
uma_zfree(V_tcpcb_zone, tm);
return (NULL);
@@ -1783,7 +1785,12 @@ tcp_newtcpcb(struct inpcb *inp)
tcp_log_tcpcbinit(tp);
#endif
if (tp->t_fb->tfb_tcp_fb_init) {
- (*tp->t_fb->tfb_tcp_fb_init)(tp);
+ if ((*tp->t_fb->tfb_tcp_fb_init)(tp)) {
+ refcount_release(&tp->t_fb->tfb_refcnt);
+ in_pcbrele_wlocked(inp);
+ uma_zfree(V_tcpcb_zone, tm);
+ return (NULL);
+ }
}
#ifdef STATS
if (V_tcp_perconn_stats_enable == 1)