All of lore.kernel.org
 help / color / mirror / Atom feed
From: Steffen Klassert <steffen.klassert@secunet.com>
To: Jun Yang <juny24602@gmail.com>
Cc: <herbert@gondor.apana.org.au>, <davem@davemloft.net>,
	<edumazet@kernel.org>, <kuba@kernel.org>, <pabeni@redhat.com>,
	<horms@kernel.org>, <chopps@labn.net>, <netdev@vger.kernel.org>,
	Jun Yang <junvyyang@tencent.com>, <stable@kernel.org>,
	TencentOS Corvus AI <corvus@tencent.com>
Subject: Re: [PATCH net] xfrm: iptfs: do not seek the sequential skb reader backwards
Date: Wed, 21 Oct 2026 10:44:35 +0200	[thread overview]
Message-ID: <ath7c-r2GuDm5Xo4@secunet.com> (raw)
In-Reply-To: <20261015021747.30346-1-juny24602@gmail.com>

This is an AI-generated review of your patch. The human sending this
email has considered the AI review valid, or at least plausible.
---
commit d3c6d0500e742002c13ba4e7b9eff45bdb2c394b
Author: Jun Yang <junvyyang@tencent.com>
xfrm: iptfs: do not seek the sequential skb reader backwards

iptfs_reassem_cont() can underflow its offset arithmetic when reading
a saved runt if the sequential reader stepped, leading to an out-of-bounds
memcpy. This patch aborts and restarts the sequence read to avoid backwards
seeks. It also fixes a sibling parser to use offset 0 when restarting.

> diff --git a/net/xfrm/xfrm_iptfs.c b/net/xfrm/xfrm_iptfs.c
> index 6920940a35b49..751cceab738a1 100644
> --- a/net/xfrm/xfrm_iptfs.c
> +++ b/net/xfrm/xfrm_iptfs.c
[ ... ]
> @@ -1046,7 +1052,7 @@ static bool __input_process_payload(struct xfrm_state *x, u32 data,
>  			struct sk_buff *save = skbseq->root_skb;
>  
>  			skb_abort_seq_read(skbseq);
> -			skb_prepare_seq_read(save, data, tail, skbseq);
> +			skb_prepare_seq_read(save, 0, tail, skbseq);
>  		}
>  
>  		if (first_skb) {

Does this code introduce a data race that corrupts reassembly?

When __input_process_payload() saves a runt, it calls iptfs_input_save_runt()
without acquiring xtfs->drop_lock or any other SA-level lock:

net/xfrm/xfrm_iptfs.c:__input_process_payload() {
    ...
    /* save the bytes we have, advance data and exit */
    iptfs_input_save_runt(xtfs, seq, hbytes, remaining);
    ...
}

This locklessly modifies xtfs->ra_runt, xtfs->ra_runtlen, and
xtfs->ra_wantseq.

Concurrently, another CPU processing packets for the same IP-TFS SA might
execute iptfs_input_ordered() and read xtfs->ra_runtlen locklessly, then
acquire drop_lock for iptfs_reassem_cont():

net/xfrm/xfrm_iptfs.c:iptfs_input_ordered() {
    ...
    /* check before locking i.e., maybe */
    if (blkoff || xtfs->ra_runtlen || xtfs->ra_newskb) {
        spin_lock(&xtfs->drop_lock);

        /* check again after lock */
        if (blkoff || xtfs->ra_runtlen || xtfs->ra_newskb) {
            data = iptfs_reassem_cont(xtfs, seq, &skbseq, skb, data,
                                      blkoff, &sublist);
        }
        spin_unlock(&xtfs->drop_lock);
    }
    ...
}

Because iptfs_input_save_runt() does not hold drop_lock, the lockless read
and locked memcpy of xtfs->ra_runt race directly with the lockless writes.
Can this cause memory corruption, torn reads, and packet corruption?

Can this code cause a lock context violation on PREEMPT_RT kernels?

In iptfs_input_ordered(), a sleepable spinlock is acquired while a
kmap_atomic mapping might still be held:

net/xfrm/xfrm_iptfs.c:iptfs_input_ordered() {
    ...
    if (skb_copy_seq_read(&skbseq, 0, ipth, sizeof(*ipth))) {
    ...
    if (blkoff || xtfs->ra_runtlen || xtfs->ra_newskb) {
        spin_lock(&xtfs->drop_lock);
    ...
}

If the packet is non-linear and the header resides in a paged fragment,
skb_copy_seq_read() maps the fragment using kmap_atomic() and leaves
skbseq.frag_data actively mapped.

Acquiring spin_lock(&xtfs->drop_lock) without first aborting the sequence
read violates lock context rules, as spinlock_t maps to a sleepable rt_mutex
on PREEMPT_RT.

Could this lead to a 'sleeping in atomic context' bug?

      reply	other threads:[~2026-10-21  8:44 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-15  2:17 [PATCH net] xfrm: iptfs: do not seek the sequential skb reader backwards Jun Yang
2026-10-21  8:44 ` Steffen Klassert [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ath7c-r2GuDm5Xo4@secunet.com \
    --to=steffen.klassert@secunet.com \
    --cc=chopps@labn.net \
    --cc=corvus@tencent.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@kernel.org \
    --cc=herbert@gondor.apana.org.au \
    --cc=horms@kernel.org \
    --cc=junvyyang@tencent.com \
    --cc=juny24602@gmail.com \
    --cc=kuba@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=stable@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.