* [PATCH v1 0/1] PAES - Fix rc handling at skcipher_walk_done
@ 2026-08-05 12:28 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
0 siblings, 1 reply; 3+ messages in thread
From: Harald Freudenberger @ 2026-08-05 12:28 UTC (permalink / raw)
To: dengler, fcallies, ifranzki
Cc: freude, linux-s390, Heiko Carstens, Vasily Gorbik,
Alexander Gordeev, linux-crypto
All the 4 PAES cipher processing loops were not checking the return
value of skcipher_walk_done() immediately after calling it. This could
lead to error masking when both the walk operation failed and a
subsequent key conversion was needed (k < n condition).
Add immediate error checks after skcipher_walk_done() in all main
processing loops (ECB, CBC, CTR, XTS modes) to ensure walk errors are
properly propagated and not masked by subsequent operations.
Changelog:
v1: initial patch
Harald Freudenberger (1):
s390/crypto: Fix return code handling at skcipher_walk_done in PAES
algorithms
arch/s390/crypto/paes_s390.c | 22 +++++++++++++++++++---
1 file changed, 19 insertions(+), 3 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH v1 1/1] s390/crypto: Fix return code handling at skcipher_walk_done in PAES algorithms
2026-08-05 12:28 [PATCH v1 0/1] PAES - Fix rc handling at skcipher_walk_done Harald Freudenberger
@ 2026-08-05 12:28 ` Harald Freudenberger
2026-08-05 12:50 ` sashiko-bot
0 siblings, 1 reply; 3+ messages in thread
From: Harald Freudenberger @ 2026-08-05 12:28 UTC (permalink / raw)
To: dengler, fcallies, ifranzki
Cc: freude, linux-s390, Heiko Carstens, Vasily Gorbik,
Alexander Gordeev, linux-crypto
All the 4 PAES cipher processing loops were not checking the return
value of skcipher_walk_done() immediately after calling it. This could
lead to error masking when both the walk operation failed and a
subsequent key conversion was needed (k < n condition).
Add immediate error checks after skcipher_walk_done() in all main
processing loops (ECB, CBC, CTR, XTS modes) to ensure walk errors are
properly propagated and not masked by subsequent operations.
Fixes: 6cd87cb5ef6c ("s390/crypto: Rework protected key AES for true asynch support")
Signed-off-by: Harald Freudenberger <freude@linux.ibm.com>
Cc: stable@vger.kernel.org # 6.16+
---
arch/s390/crypto/paes_s390.c | 22 +++++++++++++++++++---
1 file changed, 19 insertions(+), 3 deletions(-)
diff --git a/arch/s390/crypto/paes_s390.c b/arch/s390/crypto/paes_s390.c
index 973436592318..7e5cc39d4bda 100644
--- 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;
+ }
if (k < n) {
if (!maysleep) {
rc = -EKEYEXPIRED;
@@ -690,6 +693,8 @@ static int cbc_paes_do_crypt(struct s390_paes_ctx *ctx,
if (k) {
memcpy(walk->iv, param->iv, AES_BLOCK_SIZE);
rc = skcipher_walk_done(walk, nbytes - k);
+ if (rc)
+ goto out;
}
if (k < n) {
if (!maysleep) {
@@ -968,6 +973,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;
+ }
}
if (k < n) {
if (!maysleep) {
@@ -1283,8 +1293,11 @@ static int xts_paes_do_crypt_fullkey(struct s390_pxts_ctx *ctx,
n = nbytes & ~(AES_BLOCK_SIZE - 1);
k = cpacf_km(ctx->fc | req_ctx->modifier, param->key + offset,
walk->dst.virt.addr, walk->src.virt.addr, n);
- if (k)
+ if (k) {
rc = skcipher_walk_done(walk, nbytes - k);
+ if (rc)
+ goto out;
+ }
if (k < n) {
if (!maysleep) {
rc = -EKEYEXPIRED;
@@ -1377,8 +1390,11 @@ static int xts_paes_do_crypt_2keys(struct s390_pxts_ctx *ctx,
n = nbytes & ~(AES_BLOCK_SIZE - 1);
k = cpacf_km(ctx->fc | req_ctx->modifier, param->key + offset,
walk->dst.virt.addr, walk->src.virt.addr, n);
- if (k)
+ if (k) {
rc = skcipher_walk_done(walk, nbytes - k);
+ if (rc)
+ goto out;
+ }
if (k < n) {
if (!maysleep) {
rc = -EKEYEXPIRED;
--
2.43.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v1 1/1] s390/crypto: Fix return code handling at skcipher_walk_done in PAES algorithms
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
0 siblings, 0 replies; 3+ messages in thread
From: sashiko-bot @ 2026-08-05 12:50 UTC (permalink / raw)
To: Harald Freudenberger
Cc: Vasily Gorbik, Heiko Carstens, Alexander Gordeev, linux-s390
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
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-08-05 12:50 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox