Re: [PATCH v3 2/8] tls: Factor tls_rx_decrypt_record() helper

Alistair Francis <[email protected]> Thu, 12 Mar 2026 14:35:53 +1000
Newsgroups dev.linux.lists.kernel-tls-handshake,org.kernel.vger.netdev
Message-ID <CAKmqyKMLA6qBOdxTCayDzujDz4=4v3qcXGzHf5pwBH0by=O67Q@mail.gmail.com>
On Thu, Mar 12, 2026 at 11:48 AM Chuck Lever <[email protected]> wrote:
>
> From: Chuck Lever <[email protected]>
>
> recvmsg, read_sock, and splice_read each open-code the
> same sequence: zero-initialize the decrypt arguments, call
> tls_rx_one_record(), and abort the connection on failure.
>
> Extract tls_rx_decrypt_record() so each receive path shares
> a single decrypt-and-abort primitive. Each call site still
> initializes darg.inargs separately, since recvmsg sets zc
> and async between the memset and the decrypt call.
>
> Reviewed-by: Hannes Reinecke <[email protected]>
> Signed-off-by: Chuck Lever <[email protected]>

Reviewed-by: Alistair Francis <[email protected]>

Alistair

> ---
>  net/tls/tls_sw.c | 29 +++++++++++++++++------------
>  1 file changed, 17 insertions(+), 12 deletions(-)
>
> diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c
> index cedcc82669db..81e0e8aaa6f9 100644
> --- a/net/tls/tls_sw.c
> +++ b/net/tls/tls_sw.c
> @@ -1832,6 +1832,17 @@ static int tls_rx_one_record(struct sock *sk, struct msghdr *msg,
>         return tls_check_pending_rekey(sk, tls_ctx, darg->skb);
>  }
>
> +/* Decrypt one record and abort the connection on failure. */
> +static int tls_rx_decrypt_record(struct sock *sk, struct msghdr *msg,
> +                                struct tls_decrypt_arg *darg)
> +{
> +       int err = tls_rx_one_record(sk, msg, darg);
> +
> +       if (err < 0)
> +               tls_err_abort(sk, -EBADMSG);
> +       return err;
> +}
> +
>  int decrypt_skb(struct sock *sk, struct scatterlist *sgout)
>  {
>         struct tls_decrypt_arg darg = { .zc = true, };
> @@ -2132,11 +2143,9 @@ int tls_sw_recvmsg(struct sock *sk,
>                 else
>                         darg.async = false;
>
> -               err = tls_rx_one_record(sk, msg, &darg);
> -               if (err < 0) {
> -                       tls_err_abort(sk, -EBADMSG);
> +               err = tls_rx_decrypt_record(sk, msg, &darg);
> +               if (err < 0)
>                         goto recv_end;
> -               }
>
>                 async |= darg.async;
>
> @@ -2294,11 +2303,9 @@ ssize_t tls_sw_splice_read(struct socket *sock,  loff_t *ppos,
>
>                 memset(&darg.inargs, 0, sizeof(darg.inargs));
>
> -               err = tls_rx_one_record(sk, NULL, &darg);
> -               if (err < 0) {
> -                       tls_err_abort(sk, -EBADMSG);
> +               err = tls_rx_decrypt_record(sk, NULL, &darg);
> +               if (err < 0)
>                         goto splice_read_end;
> -               }
>
>                 tls_rx_rec_done(ctx);
>                 skb = darg.skb;
> @@ -2380,11 +2387,9 @@ int tls_sw_read_sock(struct sock *sk, read_descriptor_t *desc,
>
>                         memset(&darg.inargs, 0, sizeof(darg.inargs));
>
> -                       err = tls_rx_one_record(sk, NULL, &darg);
> -                       if (err < 0) {
> -                               tls_err_abort(sk, -EBADMSG);
> +                       err = tls_rx_decrypt_record(sk, NULL, &darg);
> +                       if (err < 0)
>                                 goto read_sock_end;
> -                       }
>
>                         released = tls_read_flush_backlog(sk, prot, INT_MAX,
>                                                           0, decrypted,
> --
> 2.52.0
>
>