Re: [PATCH net 1/1] net: sctp: clear current outbound stream on stream teardown

Xin Long <[email protected]> Wed, 27 May 2026 17:58:47 -0400
Newsgroups org.kernel.vger.linux-sctp,org.kernel.vger.netdev
Message-ID <CADvbK_dygG8qCDtG_LbsQ0=2PP4muNq2X7TNRqTiUMAoFjg5pA@mail.gmail.com>
On Wed, May 27, 2026 at 1:43 AM Ren Wei <[email protected]> wrote:
>
> From: Yuqi Xu <[email protected]>
>
> out_curr caches the outbound stream selected for continuing a
> fragmented message. That pointer refers directly to an entry in the
> stream->out table.
>
> When the stream table is torn down, such as during stream updates for
> association restart handling, the old outbound stream entries are freed
> before a new table is installed. Clear out_curr as part of
> sctp_stream_free() so later dequeue paths never keep following a stale
> stream pointer after the teardown.
>
> This keeps the lifetime rule local to the stream teardown helper and
> covers every current caller that frees the outbound stream table.
>
> Fixes: 5bbbbe32a431 ("sctp: introduce stream scheduler foundations")
> Cc: [email protected]
> Reported-by: Yuan Tan <[email protected]>
> Reported-by: Yifan Wu <[email protected]>
> Reported-by: Juefei Pu <[email protected]>
> Reported-by: Zhengchuan Liang <[email protected]>
> Reported-by: Xin Liu <[email protected]>
> Assisted-by: Codex:GPT-5.4
> Signed-off-by: Yuqi Xu <[email protected]>
> Signed-off-by: Ren Wei <[email protected]>
> ---
>  net/sctp/stream.c | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/net/sctp/stream.c b/net/sctp/stream.c
> index c2247793c88b..207e0a77f9af 100644
> --- a/net/sctp/stream.c
> +++ b/net/sctp/stream.c
> @@ -186,6 +186,7 @@ void sctp_stream_free(struct sctp_stream *stream)
>         int i;
>
>         sched->unsched_all(stream);
> +       stream->out_curr = NULL;
>         for (i = 0; i < stream->outcnt; i++)
>                 sctp_stream_free_ext(stream, i);
>         genradix_free(&stream->out);

As commented on another patch, purging outqueue will also clear
stream->out_curr for the corner case via:

sctp_outq_teardown() -> sctp_sched_dequeue_done(last_chunk).

so there's no need to do it here.

Thanks.