All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Harald Freudenberger" <freude@linux.ibm.com>
Cc: "Vasily Gorbik" <gor@linux.ibm.com>,
	"Heiko Carstens" <hca@linux.ibm.com>,
	"Alexander Gordeev" <agordeev@linux.ibm.com>,
	linux-s390@vger.kernel.org
Subject: Re: [PATCH v1 1/1] s390/crypto: Fix return code handling at skcipher_walk_done in PAES algorithms
Date: Wed, 05 Aug 2026 12:50:41 +0000	[thread overview]
Message-ID: <20260805125041.C43751F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260805122853.9677-2-freude@linux.ibm.com>

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:

Pre-existing issues:
- [Critical] The patch introduces a guaranteed double free of skcipher_walk resources when skcipher_walk_done() returns an error, due to redundant cleanup in the subsystem's wrapper functions.
- [High] The local stack buffer `buf` is not cleared before returning, potentially leaking plaintext or AES-CTR keystream bytes to the kernel stack.
--

--- Patch [1]: [PATCH v1 1/1] s390/crypto: Fix return code handling at skcipher_walk_done in PAES algorithms ---
commit cbb88540726dcff1286760a1df99934f56760f60
Author: Harald Freudenberger <freude@linux.ibm.com>

s390/crypto: Fix return code handling at skcipher_walk_done in PAES algorithms

This commit adds immediate error checks after skcipher_walk_done in the
PAES cipher processing loops (ECB, CBC, CTR, XTS modes). It ensures walk
errors are properly propagated and not masked by subsequent operations.

Cc: stable@vger.kernel.org # 6.16+

> diff --git a/arch/s390/crypto/paes_s390.c b/arch/s390/crypto/paes_s390.c
> --- a/arch/s390/crypto/paes_s390.c
> +++ b/arch/s390/crypto/paes_s390.c
> @@ -432,8 +432,11 @@ static int ecb_paes_do_crypt(struct s390_paes_ctx *ctx,
>  		n = nbytes & ~(AES_BLOCK_SIZE - 1);
>  		k = cpacf_km(ctx->fc | req_ctx->modifier, param,
>  			     walk->dst.virt.addr, walk->src.virt.addr, n);
> -		if (k)
> +		if (k) {
>  			rc = skcipher_walk_done(walk, nbytes - k);
> +			if (rc)
> +				goto out;
> +		}

[Severity: Critical]
This isn't a bug introduced by this patch, but does returning this error
directly to the caller result in a double free?

Looking at the wrapper function ecb_paes_crypt (and similar wrappers in this
file), if skcipher_walk_done fails and we jump to out, the wrapper will see
the error and unconditionally call skcipher_walk_done again:

ecb_paes_crypt() {
    ...
    rc = ecb_paes_do_crypt(ctx, req_ctx, false, maysleep);
    ...
    if (rc != -EINPROGRESS)
        skcipher_walk_done(walk, rc);
}

Because skcipher_walk_done frees walk->buffer and walk->page on failure
but does not set them to NULL, won't this second call attempt to free the
same dangling pointers again?

[ ... ]

> @@ -986,6 +991,11 @@ static int ctr_paes_do_crypt(struct s390_paes_ctx *ctx,
>  				       AES_BLOCK_SIZE);
>  			crypto_inc(walk->iv, AES_BLOCK_SIZE);
>  			rc = skcipher_walk_done(walk, nbytes - k);
> +			if (rc) {
> +				if (locked)
> +					mutex_unlock(&ctrblk_lock);
> +				goto out;
> +			}
>  		}

[Severity: High]
This is a pre-existing issue, but does this function leak plaintext or
keystream bytes to the kernel stack?

At the end of ctr_paes_do_crypt, the final partial block is handled using
a local stack buffer buf:

ctr_paes_do_crypt() {
    ...
    if (nbytes) {
        memset(buf, 0, AES_BLOCK_SIZE);
        memcpy(buf, walk->src.virt.addr, nbytes);
        ...
        memcpy(walk->dst.virt.addr, buf, nbytes);
        crypto_inc(walk->iv, AES_BLOCK_SIZE);
        rc = skcipher_walk_done(walk, 0);
    }

out:
    pr_debug("rc=%d\n", rc);
    return rc;
}

Because buf is abandoned on the stack without being cleared via
memzero_explicit, could subsequent unrelated syscalls leak these 
leftover bytes to user space?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260805122853.9677-2-freude@linux.ibm.com?part=1

      reply	other threads:[~2026-08-05 12:50 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-05 12:28 [PATCH v1 0/1] PAES - Fix rc handling at skcipher_walk_done Harald Freudenberger
2026-08-05 12:28 ` [PATCH v1 1/1] s390/crypto: Fix return code handling at skcipher_walk_done in PAES algorithms Harald Freudenberger
2026-08-05 12:50   ` sashiko-bot [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=20260805125041.C43751F000E9@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=agordeev@linux.ibm.com \
    --cc=freude@linux.ibm.com \
    --cc=gor@linux.ibm.com \
    --cc=hca@linux.ibm.com \
    --cc=linux-s390@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    /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.