Page MenuHomeFreeBSD

D34164.id102350.diff
No OneTemporary

D34164.id102350.diff

diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c
--- a/sys/netinet/tcp_usrreq.c
+++ b/sys/netinet/tcp_usrreq.c
@@ -1712,26 +1712,30 @@
} while(0)
#define INP_WLOCK_RECHECK(inp) INP_WLOCK_RECHECK_CLEANUP((inp), /* noop */)
-static int
+int
tcp_ctloutput_set(struct inpcb *inp, struct sockopt *sopt)
{
struct tcpcb *tp = intotcpcb(inp);
+ struct socket *so;
int error = 0;
MPASS(sopt->sopt_dir == SOPT_SET);
INP_WLOCK_ASSERT(inp);
if (sopt->sopt_level != IPPROTO_TCP) {
+ so = inp->inp_socket;
INP_WUNLOCK(inp);
+ if (so == NULL)
+ return (EINVAL);
#ifdef INET6
if (inp->inp_vflag & INP_IPV6PROTO)
- error = ip6_ctloutput(inp->inp_socket, sopt);
+ error = ip6_ctloutput(so, sopt);
#endif
#if defined(INET6) && defined(INET)
else
#endif
#ifdef INET
- error = ip_ctloutput(inp->inp_socket, sopt);
+ error = ip_ctloutput(so, sopt);
#endif
/*
* When an IP-level socket option affects TCP, pass control
@@ -1858,9 +1862,24 @@
if (tp->t_fb->tfb_tcp_fb_init) {
if((*tp->t_fb->tfb_tcp_fb_init)(tp) != 0) {
/* Fall back failed, drop the connection */
- INP_WUNLOCK(inp);
- soabort(inp->inp_socket);
- return(error);
+ so = inp->inp_socket;
+ if (so != NULL) {
+ INP_WUNLOCK(inp);
+ soabort(so);
+ } else {
+ /*
+ * This is really bad!
+ * An upcoming change
+ * to stack switching
+ * will clean it up.
+ */
+ in_pcbdrop(inp);
+ TCPSTAT_INC(tcps_closed);
+ if (tp->t_state != TCPS_CLOSED)
+ tcp_state_change(tp, TCPS_CLOSED);
+ INP_WUNLOCK(inp);
+ }
+ return (error);
}
}
goto err_out;
@@ -1890,21 +1909,25 @@
{
int error = 0;
struct tcpcb *tp;
+ struct socket *so;
MPASS(sopt->sopt_dir == SOPT_GET);
INP_WLOCK_ASSERT(inp);
if (sopt->sopt_level != IPPROTO_TCP) {
+ so = inp->inp_socket;
INP_WUNLOCK(inp);
+ if (so == NULL)
+ return (EINVAL);
#ifdef INET6
if (inp->inp_vflag & INP_IPV6PROTO)
- error = ip6_ctloutput(inp->inp_socket, sopt);
+ error = ip6_ctloutput(so, sopt);
#endif /* INET6 */
#if defined(INET6) && defined(INET)
else
#endif
#ifdef INET
- error = ip_ctloutput(inp->inp_socket, sopt);
+ error = ip_ctloutput(so, sopt);
#endif
return (error);
}
@@ -2112,6 +2135,7 @@
tcp_default_ctloutput(struct inpcb *inp, struct sockopt *sopt)
{
struct tcpcb *tp;
+ struct socket *so;
int error, opt, optval;
u_int ui;
struct tcp_info ti;
@@ -2340,11 +2364,15 @@
#ifdef KERN_TLS
case TCP_TXTLS_ENABLE:
+ so = inp->inp_socket;
INP_WUNLOCK(inp);
error = copyin_tls_enable(sopt, &tls);
if (error)
break;
- error = ktls_enable_tx(inp->inp_socket, &tls);
+ if (so != NULL)
+ error = ktls_enable_tx(so, &tls);
+ else
+ error = EINVAL;
break;
case TCP_TXTLS_MODE:
INP_WUNLOCK(inp);
@@ -2353,16 +2381,24 @@
return (error);
INP_WLOCK_RECHECK(inp);
- error = ktls_set_tx_mode(inp->inp_socket, ui);
+ so = inp->inp_socket;
+ if (so != NULL)
+ error = ktls_set_tx_mode(so, ui);
+ else
+ error = EINVAL;
INP_WUNLOCK(inp);
break;
case TCP_RXTLS_ENABLE:
+ so = inp->inp_socket;
INP_WUNLOCK(inp);
error = sooptcopyin(sopt, &tls, sizeof(tls),
sizeof(tls));
if (error)
break;
- error = ktls_enable_rx(inp->inp_socket, &tls);
+ if (so != NULL)
+ error = ktls_enable_rx(so, &tls);
+ else
+ error = EINVAL;
break;
#endif
@@ -2707,14 +2743,22 @@
#endif
#ifdef KERN_TLS
case TCP_TXTLS_MODE:
- error = ktls_get_tx_mode(inp->inp_socket, &optval);
+ so = inp->inp_socket;
+ if (so != NULL)
+ error = ktls_get_tx_mode(so, &optval);
+ else
+ error = EINVAL;
INP_WUNLOCK(inp);
if (error == 0)
error = sooptcopyout(sopt, &optval,
sizeof(optval));
break;
case TCP_RXTLS_MODE:
- error = ktls_get_rx_mode(inp->inp_socket, &optval);
+ so = inp->inp_socket;
+ if (so != NULL)
+ error = ktls_get_rx_mode(so, &optval);
+ else
+ error = EINVAL;
INP_WUNLOCK(inp);
if (error == 0)
error = sooptcopyout(sopt, &optval,
diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h
--- a/sys/netinet/tcp_var.h
+++ b/sys/netinet/tcp_var.h
@@ -1128,6 +1128,7 @@
struct tcp_function_block *
find_and_ref_tcp_fb(struct tcp_function_block *fs);
int tcp_default_ctloutput(struct inpcb *inp, struct sockopt *sopt);
+int tcp_ctloutput_set(struct inpcb *inp, struct sockopt *sopt);
extern counter_u64_t tcp_inp_lro_direct_queue;
extern counter_u64_t tcp_inp_lro_wokeup_queue;

File Metadata

Mime Type
text/plain
Expires
Thu, Apr 30, 12:58 AM (17 h, 12 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32327866
Default Alt Text
D34164.id102350.diff (4 KB)

Event Timeline