aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Tuexen <tuexen@FreeBSD.org>2024-06-27 06:26:34 +0000
committerMichael Tuexen <tuexen@FreeBSD.org>2024-08-03 22:50:22 +0000
commitd02a9ef1f03aaa5fd6cc7c27ba1facdf997f0a67 (patch)
tree01b86ff19b4e0c9d2f2ed5f52fb3e508c63872d8
parent5632dd45cc10ec75f9ba679b9b985c82b7a40267 (diff)
tcp: improve failure handling in tcp_newtcpcb()
In case of a failure of tcp_newtcpcb, where NULL is returned, * call CC_ALGO(tp)->cb_destroy, after CC_ALGO(tp)->cb_init was called. * call khelp_destroy_osd(), after khelp_init_osd() was called. Reviewed by: glebius, rscheff Sponsored by: Netflix, Inc. Differential Revision: https://reviews.freebsd.org/D45753 (cherry picked from commit 14fee5324a9b76fff6e8aad266600eefab3ef335)
-rw-r--r--sys/netinet/tcp_subr.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index afa2dc2a3a95..8785963cc7d0 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -2256,6 +2256,10 @@ tcp_newtcpcb(struct inpcb *inp)
#ifdef TCP_HHOOK
if (khelp_init_osd(HELPER_CLASS_TCP, &tp->t_osd)) {
+ if (CC_ALGO(tp)->cb_destroy != NULL)
+ CC_ALGO(tp)->cb_destroy(&tp->t_ccv);
+ CC_DATA(tp) = NULL;
+ cc_detach(tp);
if (tp->t_fb->tfb_tcp_fb_fini)
(*tp->t_fb->tfb_tcp_fb_fini)(tp, 1);
refcount_release(&tp->t_fb->tfb_refcnt);
@@ -2332,6 +2336,13 @@ tcp_newtcpcb(struct inpcb *inp)
tp->t_pacing_rate = -1;
if (tp->t_fb->tfb_tcp_fb_init) {
if ((*tp->t_fb->tfb_tcp_fb_init)(tp, &tp->t_fb_ptr)) {
+ if (CC_ALGO(tp)->cb_destroy != NULL)
+ CC_ALGO(tp)->cb_destroy(&tp->t_ccv);
+ CC_DATA(tp) = NULL;
+ cc_detach(tp);
+#ifdef TCP_HHOOK
+ khelp_destroy_osd(&tp->t_osd);
+#endif
refcount_release(&tp->t_fb->tfb_refcnt);
return (NULL);
}