All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH mptcp-net 0/2] mptcp: tentative fix for issues246 &&
@ 2023-02-08 21:44 Paolo Abeni
  2023-02-08 21:44 ` [PATCH mptcp-net 1/2] mptcp: use the workqueue to destroy unaccepted sockets Paolo Abeni
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Paolo Abeni @ 2023-02-08 21:44 UTC (permalink / raw)
  To: mptcp; +Cc: Christoph Paasch

Sharing these very early, because I can't reproduce the issues locally.
Even the commit messages are early draft.

@Christoph could you please check the relevant repros here?

I *think* there still some refcount problem to address in the new code,
any sharp eyes more then welcome ;)

Targeting -net even if bases on top of corrent mptcp-next, as
the merge window is almost imminent.

Paolo Abeni (2):
  mptcp: use the workqueue to destroy unaccepted sockets.
  mptcp: fix UaF in listener shutdown

 net/mptcp/protocol.c | 27 ++++++++-----
 net/mptcp/protocol.h |  4 +-
 net/mptcp/subflow.c  | 91 +++++---------------------------------------
 3 files changed, 28 insertions(+), 94 deletions(-)

-- 
2.39.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH mptcp-net 1/2] mptcp: use the workqueue to destroy unaccepted sockets.
  2023-02-08 21:44 [PATCH mptcp-net 0/2] mptcp: tentative fix for issues246 && Paolo Abeni
@ 2023-02-08 21:44 ` Paolo Abeni
  2023-02-08 23:07   ` Paolo Abeni
  2023-02-08 21:44 ` [PATCH mptcp-net 2/2] mptcp: fix UaF in listener shutdown Paolo Abeni
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 8+ messages in thread
From: Paolo Abeni @ 2023-02-08 21:44 UTC (permalink / raw)
  To: mptcp; +Cc: Christoph Paasch

Christoph reported a UaF while disposing unaccepted MPC
subflow.

We need to properly clean-up all the paired MPTCP-level
resources and be sure to release the msk last, even when
the unaccepted subflow is destroyed by the TCP internals
via inet_child_forget().

We can re-use the existing MPTCP_WORK_CLOSE_SUBFLOW infra,
explicitly checking that for the critical scenario: the
closed subflow is the MPC one, the msk is not accepted and
eventually going through full cleanup.

With such change, __mptcp_destroy_sock() is always called
on msk sockets, even on accepted ones. We don't need anymore
to transiently drop one sk reference at msk clone time.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
 net/mptcp/protocol.c | 26 +++++++++++++++++---------
 net/mptcp/protocol.h |  3 ++-
 net/mptcp/subflow.c  | 11 +++++++++--
 3 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 546df81c162f..d7588535bf6d 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -2444,9 +2444,10 @@ static unsigned int mptcp_sync_mss(struct sock *sk, u32 pmtu)
 	return 0;
 }
 
-static void __mptcp_close_subflow(struct mptcp_sock *msk)
+static void __mptcp_close_subflow(struct sock *sk)
 {
 	struct mptcp_subflow_context *subflow, *tmp;
+	struct mptcp_sock *msk = mptcp_sk(sk);
 
 	might_sleep();
 
@@ -2460,7 +2461,15 @@ static void __mptcp_close_subflow(struct mptcp_sock *msk)
 		if (!skb_queue_empty_lockless(&ssk->sk_receive_queue))
 			continue;
 
-		mptcp_close_ssk((struct sock *)msk, ssk, subflow);
+		mptcp_close_ssk(sk, ssk, subflow);
+	}
+
+	/* if the MPC subflow has been closed before the msk is accepted,
+	 * msk will never be accept-ed, close it now
+	 */
+	if (!msk->first && msk->in_accept_queue) {
+		sock_set_flag(sk, SOCK_DEAD);
+		sk->sk_state = TCP_CLOSE;
 	}
 }
 
@@ -2684,6 +2693,9 @@ static void mptcp_worker(struct work_struct *work)
 	__mptcp_check_send_data_fin(sk);
 	mptcp_check_data_fin(sk);
 
+	if (test_and_clear_bit(MPTCP_WORK_CLOSE_SUBFLOW, &msk->flags))
+		__mptcp_close_subflow(sk);
+
 	/* There is no point in keeping around an orphaned sk timedout or
 	 * closed, but we need the msk around to reply to incoming DATA_FIN,
 	 * even if it is orphaned and in FIN_WAIT2 state
@@ -2699,9 +2711,6 @@ static void mptcp_worker(struct work_struct *work)
 		}
 	}
 
-	if (test_and_clear_bit(MPTCP_WORK_CLOSE_SUBFLOW, &msk->flags))
-		__mptcp_close_subflow(msk);
-
 	if (test_and_clear_bit(MPTCP_WORK_RTX, &msk->flags))
 		__mptcp_retrans(sk);
 
@@ -3149,6 +3158,7 @@ struct sock *mptcp_sk_clone(const struct sock *sk,
 	msk->local_key = subflow_req->local_key;
 	msk->token = subflow_req->token;
 	msk->subflow = NULL;
+	msk->in_accept_queue = 1;
 	WRITE_ONCE(msk->fully_established, false);
 	if (mp_opt->suboptions & OPTION_MPTCP_CSUMREQD)
 		WRITE_ONCE(msk->csum_enabled, true);
@@ -3169,8 +3179,7 @@ struct sock *mptcp_sk_clone(const struct sock *sk,
 	security_inet_csk_clone(nsk, req);
 	bh_unlock_sock(nsk);
 
-	/* keep a single reference */
-	__sock_put(nsk);
+	/* note: the newly allocated socket refcount is 2 now */
 	return nsk;
 }
 
@@ -3226,8 +3235,6 @@ static struct sock *mptcp_accept(struct sock *sk, int flags, int *err,
 			goto out;
 		}
 
-		/* acquire the 2nd reference for the owning socket */
-		sock_hold(new_mptcp_sock);
 		newsk = new_mptcp_sock;
 		MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPCAPABLEPASSIVEACK);
 	} else {
@@ -3781,6 +3788,7 @@ static int mptcp_stream_accept(struct socket *sock, struct socket *newsock,
 		struct mptcp_subflow_context *subflow;
 
 		set_bit(SOCK_CUSTOM_SOCKOPT, &newsock->flags);
+		msk->in_accept_queue = 0;
 
 		/* set ssk->sk_socket of accept()ed flows to mptcp socket.
 		 * This is needed so NOSPACE flag can be set from tcp stack.
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 3a055438c65e..252f050c96c6 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -294,7 +294,8 @@ struct mptcp_sock {
 	u8		recvmsg_inq:1,
 			cork:1,
 			nodelay:1,
-			fastopening:1;
+			fastopening:1,
+			in_accept_queue:1;
 	int		connect_flags;
 	struct work_struct work;
 	struct sk_buff  *ooo_last_skb;
diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index f075607adad4..1dff2ea6d6d3 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -693,9 +693,10 @@ static bool subflow_hmac_valid(const struct request_sock *req,
 
 static void mptcp_force_close(struct sock *sk)
 {
-	/* the msk is not yet exposed to user-space */
+	/* the msk is not yet exposed to user-space, and refcount is 2 */
 	inet_sk_state_store(sk, TCP_CLOSE);
 	sk_common_release(sk);
+	sock_put(sk);
 }
 
 static void subflow_ulp_fallback(struct sock *sk,
@@ -1854,7 +1855,6 @@ void mptcp_subflow_queue_clean(struct sock *listener_sk, struct sock *listener_s
 		struct sock *sk = (struct sock *)msk;
 		bool do_cancel_work;
 
-		sock_hold(sk);
 		lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
 		next = msk->dl_next;
 		msk->dl_next = NULL;
@@ -1949,6 +1949,13 @@ static void subflow_ulp_release(struct sock *ssk)
 		 * the ctx alive, will be freed by __mptcp_close_ssk()
 		 */
 		release = ctx->disposable;
+
+		/* inet_child_forget() does not call sk_state_change(),
+		 * explicitly trigger the socket close machinery
+		 */
+		if (!release && !test_and_set_bit(MPTCP_WORK_CLOSE_SUBFLOW,
+						  &mptcp_sk(sk)->flags))
+			schedule_work(&mptcp_sk(sk)->work);
 		sock_put(sk);
 	}
 
-- 
2.39.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH mptcp-net 2/2] mptcp: fix UaF in listener shutdown
  2023-02-08 21:44 [PATCH mptcp-net 0/2] mptcp: tentative fix for issues246 && Paolo Abeni
  2023-02-08 21:44 ` [PATCH mptcp-net 1/2] mptcp: use the workqueue to destroy unaccepted sockets Paolo Abeni
@ 2023-02-08 21:44 ` Paolo Abeni
  2023-02-08 23:09   ` mptcp: fix UaF in listener shutdown: Tests Results MPTCP CI
  2023-02-09 18:57   ` MPTCP CI
  2023-02-09  4:54 ` [PATCH mptcp-net 0/2] mptcp: tentative fix for issues246 && Christoph Paasch
  2023-02-09 16:56 ` Christoph Paasch
  3 siblings, 2 replies; 8+ messages in thread
From: Paolo Abeni @ 2023-02-08 21:44 UTC (permalink / raw)
  To: mptcp; +Cc: Christoph Paasch

After the previous patch we don't need anymore special-casing
msk listener socket cleanup: the mptcp worker will process each
of the unaccepted msk sockets.

Just drop the now unnecessary code.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
 net/mptcp/protocol.c |  1 -
 net/mptcp/protocol.h |  1 -
 net/mptcp/subflow.c  | 80 --------------------------------------------
 3 files changed, 82 deletions(-)

diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index d7588535bf6d..ae2d715f82b5 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -2400,7 +2400,6 @@ static void __mptcp_close_ssk(struct sock *sk, struct sock *ssk,
 		/* otherwise tcp will dispose of the ssk and subflow ctx */
 		if (ssk->sk_state == TCP_LISTEN) {
 			tcp_set_state(ssk, TCP_CLOSE);
-			mptcp_subflow_queue_clean(sk, ssk);
 			inet_csk_listen_stop(ssk);
 			mptcp_event_pm_listener(ssk, MPTCP_EVENT_LISTENER_CLOSED);
 		}
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 252f050c96c6..ba4d22ffd228 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -631,7 +631,6 @@ void mptcp_close_ssk(struct sock *sk, struct sock *ssk,
 		     struct mptcp_subflow_context *subflow);
 void __mptcp_subflow_send_ack(struct sock *ssk);
 void mptcp_subflow_reset(struct sock *ssk);
-void mptcp_subflow_queue_clean(struct sock *sk, struct sock *ssk);
 void mptcp_sock_graft(struct sock *sk, struct socket *parent);
 struct socket *__mptcp_nmpc_socket(struct mptcp_sock *msk);
 bool __mptcp_close(struct sock *sk, long timeout);
diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index 1dff2ea6d6d3..4f397d336811 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -1814,86 +1814,6 @@ static void subflow_state_change(struct sock *sk)
 	}
 }
 
-void mptcp_subflow_queue_clean(struct sock *listener_sk, struct sock *listener_ssk)
-{
-	struct request_sock_queue *queue = &inet_csk(listener_ssk)->icsk_accept_queue;
-	struct mptcp_sock *msk, *next, *head = NULL;
-	struct request_sock *req;
-
-	/* build a list of all unaccepted mptcp sockets */
-	spin_lock_bh(&queue->rskq_lock);
-	for (req = queue->rskq_accept_head; req; req = req->dl_next) {
-		struct mptcp_subflow_context *subflow;
-		struct sock *ssk = req->sk;
-		struct mptcp_sock *msk;
-
-		if (!sk_is_mptcp(ssk))
-			continue;
-
-		subflow = mptcp_subflow_ctx(ssk);
-		if (!subflow || !subflow->conn)
-			continue;
-
-		/* skip if already in list */
-		msk = mptcp_sk(subflow->conn);
-		if (msk->dl_next || msk == head)
-			continue;
-
-		msk->dl_next = head;
-		head = msk;
-	}
-	spin_unlock_bh(&queue->rskq_lock);
-	if (!head)
-		return;
-
-	/* can't acquire the msk socket lock under the subflow one,
-	 * or will cause ABBA deadlock
-	 */
-	release_sock(listener_ssk);
-
-	for (msk = head; msk; msk = next) {
-		struct sock *sk = (struct sock *)msk;
-		bool do_cancel_work;
-
-		lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
-		next = msk->dl_next;
-		msk->dl_next = NULL;
-
-		/* The upcoming mptcp_close is going to drop all the references
-		 * to the first subflow, ignoring that one of such reference is
-		 * owned by the request socket still in the accept queue and that
-		 * later inet_csk_listen_stop will drop it.
-		 * Acquire an extra reference here to avoid an UaF at that point.
-		 */
-		if (msk->first)
-			sock_hold(msk->first);
-
-		do_cancel_work = __mptcp_close(sk, -1);
-		release_sock(sk);
-		if (do_cancel_work) {
-			/* lockdep will report a false positive ABBA deadlock
-			 * between cancel_work_sync and the listener socket.
-			 * The involved locks belong to different sockets WRT
-			 * the existing AB chain.
-			 * Using a per socket key is problematic as key
-			 * deregistration requires process context and must be
-			 * performed at socket disposal time, in atomic
-			 * context.
-			 * Just tell lockdep to consider the listener socket
-			 * released here.
-			 */
-			mutex_release(&listener_sk->sk_lock.dep_map, _RET_IP_);
-			mptcp_cancel_work(sk);
-			mutex_acquire(&listener_sk->sk_lock.dep_map,
-				      SINGLE_DEPTH_NESTING, 0, _RET_IP_);
-		}
-		sock_put(sk);
-	}
-
-	/* we are still under the listener msk socket lock */
-	lock_sock_nested(listener_ssk, SINGLE_DEPTH_NESTING);
-}
-
 static int subflow_ulp_init(struct sock *sk)
 {
 	struct inet_connection_sock *icsk = inet_csk(sk);
-- 
2.39.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH mptcp-net 1/2] mptcp: use the workqueue to destroy unaccepted sockets.
  2023-02-08 21:44 ` [PATCH mptcp-net 1/2] mptcp: use the workqueue to destroy unaccepted sockets Paolo Abeni
@ 2023-02-08 23:07   ` Paolo Abeni
  0 siblings, 0 replies; 8+ messages in thread
From: Paolo Abeni @ 2023-02-08 23:07 UTC (permalink / raw)
  To: mptcp; +Cc: Christoph Paasch

On Wed, 2023-02-08 at 22:44 +0100, Paolo Abeni wrote:
> Christoph reported a UaF while disposing unaccepted MPC
> subflow.
> 
> We need to properly clean-up all the paired MPTCP-level
> resources and be sure to release the msk last, even when
> the unaccepted subflow is destroyed by the TCP internals
> via inet_child_forget().
> 
> We can re-use the existing MPTCP_WORK_CLOSE_SUBFLOW infra,
> explicitly checking that for the critical scenario: the
> closed subflow is the MPC one, the msk is not accepted and
> eventually going through full cleanup.
> 
> With such change, __mptcp_destroy_sock() is always called
> on msk sockets, even on accepted ones. We don't need anymore
> to transiently drop one sk reference at msk clone time.
> 
> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
> ---
>  net/mptcp/protocol.c | 26 +++++++++++++++++---------
>  net/mptcp/protocol.h |  3 ++-
>  net/mptcp/subflow.c  | 11 +++++++++--
>  3 files changed, 28 insertions(+), 12 deletions(-)
> 
> diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
> index 546df81c162f..d7588535bf6d 100644
> --- a/net/mptcp/protocol.c
> +++ b/net/mptcp/protocol.c
> @@ -2444,9 +2444,10 @@ static unsigned int mptcp_sync_mss(struct sock *sk, u32 pmtu)
>  	return 0;
>  }
>  
> -static void __mptcp_close_subflow(struct mptcp_sock *msk)
> +static void __mptcp_close_subflow(struct sock *sk)
>  {
>  	struct mptcp_subflow_context *subflow, *tmp;
> +	struct mptcp_sock *msk = mptcp_sk(sk);
>  
>  	might_sleep();
>  
> @@ -2460,7 +2461,15 @@ static void __mptcp_close_subflow(struct mptcp_sock *msk)
>  		if (!skb_queue_empty_lockless(&ssk->sk_receive_queue))
>  			continue;
>  
> -		mptcp_close_ssk((struct sock *)msk, ssk, subflow);
> +		mptcp_close_ssk(sk, ssk, subflow);
> +	}
> +
> +	/* if the MPC subflow has been closed before the msk is accepted,
> +	 * msk will never be accept-ed, close it now
> +	 */
> +	if (!msk->first && msk->in_accept_queue) {
> +		sock_set_flag(sk, SOCK_DEAD);
> +		sk->sk_state = TCP_CLOSE;
>  	}
>  }
>  
> @@ -2684,6 +2693,9 @@ static void mptcp_worker(struct work_struct *work)
>  	__mptcp_check_send_data_fin(sk);
>  	mptcp_check_data_fin(sk);
>  
> +	if (test_and_clear_bit(MPTCP_WORK_CLOSE_SUBFLOW, &msk->flags))
> +		__mptcp_close_subflow(sk);
> +
>  	/* There is no point in keeping around an orphaned sk timedout or
>  	 * closed, but we need the msk around to reply to incoming DATA_FIN,
>  	 * even if it is orphaned and in FIN_WAIT2 state
> @@ -2699,9 +2711,6 @@ static void mptcp_worker(struct work_struct *work)
>  		}
>  	}
>  
> -	if (test_and_clear_bit(MPTCP_WORK_CLOSE_SUBFLOW, &msk->flags))
> -		__mptcp_close_subflow(msk);
> -
>  	if (test_and_clear_bit(MPTCP_WORK_RTX, &msk->flags))
>  		__mptcp_retrans(sk);
>  
> @@ -3149,6 +3158,7 @@ struct sock *mptcp_sk_clone(const struct sock *sk,
>  	msk->local_key = subflow_req->local_key;
>  	msk->token = subflow_req->token;
>  	msk->subflow = NULL;
> +	msk->in_accept_queue = 1;
>  	WRITE_ONCE(msk->fully_established, false);
>  	if (mp_opt->suboptions & OPTION_MPTCP_CSUMREQD)
>  		WRITE_ONCE(msk->csum_enabled, true);
> @@ -3169,8 +3179,7 @@ struct sock *mptcp_sk_clone(const struct sock *sk,
>  	security_inet_csk_clone(nsk, req);
>  	bh_unlock_sock(nsk);
>  
> -	/* keep a single reference */
> -	__sock_put(nsk);
> +	/* note: the newly allocated socket refcount is 2 now */
>  	return nsk;
>  }
>  
> @@ -3226,8 +3235,6 @@ static struct sock *mptcp_accept(struct sock *sk, int flags, int *err,
>  			goto out;
>  		}
>  
> -		/* acquire the 2nd reference for the owning socket */
> -		sock_hold(new_mptcp_sock);
>  		newsk = new_mptcp_sock;
>  		MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPCAPABLEPASSIVEACK);
>  	} else {
> @@ -3781,6 +3788,7 @@ static int mptcp_stream_accept(struct socket *sock, struct socket *newsock,
>  		struct mptcp_subflow_context *subflow;
>  
>  		set_bit(SOCK_CUSTOM_SOCKOPT, &newsock->flags);
> +		msk->in_accept_queue = 0;
>  
>  		/* set ssk->sk_socket of accept()ed flows to mptcp socket.
>  		 * This is needed so NOSPACE flag can be set from tcp stack.
> diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
> index 3a055438c65e..252f050c96c6 100644
> --- a/net/mptcp/protocol.h
> +++ b/net/mptcp/protocol.h
> @@ -294,7 +294,8 @@ struct mptcp_sock {
>  	u8		recvmsg_inq:1,
>  			cork:1,
>  			nodelay:1,
> -			fastopening:1;
> +			fastopening:1,
> +			in_accept_queue:1;
>  	int		connect_flags;
>  	struct work_struct work;
>  	struct sk_buff  *ooo_last_skb;
> diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
> index f075607adad4..1dff2ea6d6d3 100644
> --- a/net/mptcp/subflow.c
> +++ b/net/mptcp/subflow.c
> @@ -693,9 +693,10 @@ static bool subflow_hmac_valid(const struct request_sock *req,
>  
>  static void mptcp_force_close(struct sock *sk)
>  {
> -	/* the msk is not yet exposed to user-space */
> +	/* the msk is not yet exposed to user-space, and refcount is 2 */
>  	inet_sk_state_store(sk, TCP_CLOSE);
>  	sk_common_release(sk);
> +	sock_put(sk);
>  }
>  
>  static void subflow_ulp_fallback(struct sock *sk,
> @@ -1854,7 +1855,6 @@ void mptcp_subflow_queue_clean(struct sock *listener_sk, struct sock *listener_s
>  		struct sock *sk = (struct sock *)msk;
>  		bool do_cancel_work;
>  
> -		sock_hold(sk);
>  		lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
>  		next = msk->dl_next;
>  		msk->dl_next = NULL;
> @@ -1949,6 +1949,13 @@ static void subflow_ulp_release(struct sock *ssk)
>  		 * the ctx alive, will be freed by __mptcp_close_ssk()
>  		 */
>  		release = ctx->disposable;
> +
> +		/* inet_child_forget() does not call sk_state_change(),
> +		 * explicitly trigger the socket close machinery
> +		 */
> +		if (!release && !test_and_set_bit(MPTCP_WORK_CLOSE_SUBFLOW,
> +						  &mptcp_sk(sk)->flags))
> +			schedule_work(&mptcp_sk(sk)->work);

The above is buggy. Instead of 
			schedule_work(&mptcp_sk(sk)->work);
should be
			mptcp_schedule_work(sk);

@Christoph: could you add the above editing while testing, or do you
prefer I'll send a the full series edited?

Thanks!

Paolo


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: mptcp: fix UaF in listener shutdown: Tests Results
  2023-02-08 21:44 ` [PATCH mptcp-net 2/2] mptcp: fix UaF in listener shutdown Paolo Abeni
@ 2023-02-08 23:09   ` MPTCP CI
  2023-02-09 18:57   ` MPTCP CI
  1 sibling, 0 replies; 8+ messages in thread
From: MPTCP CI @ 2023-02-08 23:09 UTC (permalink / raw)
  To: Paolo Abeni; +Cc: mptcp

Hi Paolo,

Thank you for your modifications, that's great!

Our CI did some validations and here is its report:

- KVM Validation: normal (except selftest_mptcp_join):
  - Critical: 1 Call Trace(s) ❌:
  - Task: https://cirrus-ci.com/task/4517118641700864
  - Summary: https://api.cirrus-ci.com/v1/artifact/task/4517118641700864/summary/summary.txt

- KVM Validation: debug (except selftest_mptcp_join):
  - Unstable: 1 failed test(s): packetdrill_sockopts - Critical: 1 Call Trace(s) ❌:
  - Task: https://cirrus-ci.com/task/5080068595122176
  - Summary: https://api.cirrus-ci.com/v1/artifact/task/5080068595122176/summary/summary.txt

- KVM Validation: debug (only selftest_mptcp_join):
  - Success! ✅:
  - Task: https://cirrus-ci.com/task/6205968501964800
  - Summary: https://api.cirrus-ci.com/v1/artifact/task/6205968501964800/summary/summary.txt

- KVM Validation: normal (only selftest_mptcp_join):
  - Success! ✅:
  - Task: https://cirrus-ci.com/task/5643018548543488
  - Summary: https://api.cirrus-ci.com/v1/artifact/task/5643018548543488/summary/summary.txt

Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/ae7c0cbcdb5b


If there are some issues, you can reproduce them using the same environment as
the one used by the CI thanks to a docker image, e.g.:

    $ cd [kernel source code]
    $ docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" --privileged --rm -it \
        --pull always mptcp/mptcp-upstream-virtme-docker:latest \
        auto-debug

For more details:

    https://github.com/multipath-tcp/mptcp-upstream-virtme-docker


Please note that despite all the efforts that have been already done to have a
stable tests suite when executed on a public CI like here, it is possible some
reported issues are not due to your modifications. Still, do not hesitate to
help us improve that ;-)

Cheers,
MPTCP GH Action bot
Bot operated by Matthieu Baerts (Tessares)

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH mptcp-net 0/2] mptcp: tentative fix for issues246 &&
  2023-02-08 21:44 [PATCH mptcp-net 0/2] mptcp: tentative fix for issues246 && Paolo Abeni
  2023-02-08 21:44 ` [PATCH mptcp-net 1/2] mptcp: use the workqueue to destroy unaccepted sockets Paolo Abeni
  2023-02-08 21:44 ` [PATCH mptcp-net 2/2] mptcp: fix UaF in listener shutdown Paolo Abeni
@ 2023-02-09  4:54 ` Christoph Paasch
  2023-02-09 16:56 ` Christoph Paasch
  3 siblings, 0 replies; 8+ messages in thread
From: Christoph Paasch @ 2023-02-09  4:54 UTC (permalink / raw)
  To: Paolo Abeni; +Cc: mptcp


> On Feb 8, 2023, at 1:44 PM, Paolo Abeni <pabeni@redhat.com> wrote:
> 
> Sharing these very early, because I can't reproduce the issues locally.
> Even the commit messages are early draft.

Turns out I can’t repro either (neither with the syzkaller-repro nor with the c-repro). All I have is the syzkaller report…

I will update my syzkaller kernel and also apply Kuniyuki’s patch and run syzkaller again.


Christoph

> 
> @Christoph could you please check the relevant repros here?
> 
> I *think* there still some refcount problem to address in the new code,
> any sharp eyes more then welcome ;)
> 
> Targeting -net even if bases on top of corrent mptcp-next, as
> the merge window is almost imminent.
> 
> Paolo Abeni (2):
>  mptcp: use the workqueue to destroy unaccepted sockets.
>  mptcp: fix UaF in listener shutdown
> 
> net/mptcp/protocol.c | 27 ++++++++-----
> net/mptcp/protocol.h |  4 +-
> net/mptcp/subflow.c  | 91 +++++---------------------------------------
> 3 files changed, 28 insertions(+), 94 deletions(-)
> 
> -- 
> 2.39.1
> 
> 


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH mptcp-net 0/2] mptcp: tentative fix for issues246 &&
  2023-02-08 21:44 [PATCH mptcp-net 0/2] mptcp: tentative fix for issues246 && Paolo Abeni
                   ` (2 preceding siblings ...)
  2023-02-09  4:54 ` [PATCH mptcp-net 0/2] mptcp: tentative fix for issues246 && Christoph Paasch
@ 2023-02-09 16:56 ` Christoph Paasch
  3 siblings, 0 replies; 8+ messages in thread
From: Christoph Paasch @ 2023-02-09 16:56 UTC (permalink / raw)
  To: Paolo Abeni; +Cc: mptcp



> On Feb 8, 2023, at 1:44 PM, Paolo Abeni <pabeni@redhat.com> wrote:
> 
> Sharing these very early, because I can't reproduce the issues locally.
> Even the commit messages are early draft.
> 
> @Christoph could you please check the relevant repros here?
> 
> I *think* there still some refcount problem to address in the new code,
> any sharp eyes more then welcome ;)
> 
> Targeting -net even if bases on top of corrent mptcp-next, as
> the merge window is almost imminent.
> 
> Paolo Abeni (2):
>  mptcp: use the workqueue to destroy unaccepted sockets.
>  mptcp: fix UaF in listener shutdown
> 
> net/mptcp/protocol.c | 27 ++++++++-----
> net/mptcp/protocol.h |  4 +-
> net/mptcp/subflow.c  | 91 +++++---------------------------------------
> 3 files changed, 28 insertions(+), 94 deletions(-)

I was able to get a new reproducer for a UaF read in subflow_error_report.

Your patches (with the schedule-work fix) indeed fix the KASAN-issue.

Tested-by: Christoph Paasch <cpaasch@apple.com>


Christoph


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: mptcp: fix UaF in listener shutdown: Tests Results
  2023-02-08 21:44 ` [PATCH mptcp-net 2/2] mptcp: fix UaF in listener shutdown Paolo Abeni
  2023-02-08 23:09   ` mptcp: fix UaF in listener shutdown: Tests Results MPTCP CI
@ 2023-02-09 18:57   ` MPTCP CI
  1 sibling, 0 replies; 8+ messages in thread
From: MPTCP CI @ 2023-02-09 18:57 UTC (permalink / raw)
  To: Paolo Abeni; +Cc: mptcp

Hi Paolo,

Thank you for your modifications, that's great!

Our CI did some validations and here is its report:

- KVM Validation: normal (except selftest_mptcp_join):
  - Critical: 1 Call Trace(s) ❌:
  - Task: https://cirrus-ci.com/task/5329004899598336
  - Summary: https://api.cirrus-ci.com/v1/artifact/task/5329004899598336/summary/summary.txt

- KVM Validation: debug (except selftest_mptcp_join):
  - Critical: 1 Call Trace(s) ❌:
  - Task: https://cirrus-ci.com/task/5047529922887680
  - Summary: https://api.cirrus-ci.com/v1/artifact/task/5047529922887680/summary/summary.txt

- KVM Validation: normal (only selftest_mptcp_join):
  - Success! ✅:
  - Task: https://cirrus-ci.com/task/6454904806440960
  - Summary: https://api.cirrus-ci.com/v1/artifact/task/6454904806440960/summary/summary.txt

- KVM Validation: debug (only selftest_mptcp_join):
  - Success! ✅:
  - Task: https://cirrus-ci.com/task/6173429829730304
  - Summary: https://api.cirrus-ci.com/v1/artifact/task/6173429829730304/summary/summary.txt

Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/cbc3e5c367d4


If there are some issues, you can reproduce them using the same environment as
the one used by the CI thanks to a docker image, e.g.:

    $ cd [kernel source code]
    $ docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" --privileged --rm -it \
        --pull always mptcp/mptcp-upstream-virtme-docker:latest \
        auto-debug

For more details:

    https://github.com/multipath-tcp/mptcp-upstream-virtme-docker


Please note that despite all the efforts that have been already done to have a
stable tests suite when executed on a public CI like here, it is possible some
reported issues are not due to your modifications. Still, do not hesitate to
help us improve that ;-)

Cheers,
MPTCP GH Action bot
Bot operated by Matthieu Baerts (Tessares)

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2023-02-09 18:57 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-02-08 21:44 [PATCH mptcp-net 0/2] mptcp: tentative fix for issues246 && Paolo Abeni
2023-02-08 21:44 ` [PATCH mptcp-net 1/2] mptcp: use the workqueue to destroy unaccepted sockets Paolo Abeni
2023-02-08 23:07   ` Paolo Abeni
2023-02-08 21:44 ` [PATCH mptcp-net 2/2] mptcp: fix UaF in listener shutdown Paolo Abeni
2023-02-08 23:09   ` mptcp: fix UaF in listener shutdown: Tests Results MPTCP CI
2023-02-09 18:57   ` MPTCP CI
2023-02-09  4:54 ` [PATCH mptcp-net 0/2] mptcp: tentative fix for issues246 && Christoph Paasch
2023-02-09 16:56 ` Christoph Paasch

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.