* [PATCH v2 0/2] crypto: fix handling & reporting of errors when erasing keyslots
@ 2026-10-26 11:12 Daniel P. Berrangé
2026-10-26 11:12 ` [PATCH v2 1/2] crypto: avoid overwriting Error object erasing keyslot Daniel P. Berrangé
2026-10-26 11:12 ` [PATCH v2 2/2] crypto: add newline in error hint messages Daniel P. Berrangé
0 siblings, 2 replies; 7+ messages in thread
From: Daniel P. Berrangé @ 2026-10-26 11:12 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, Markus Armbruster, Daniel P. Berrangé
Changed in v2:
- Simplify first patch to rely error_propagate auto
discarding dupe errors.
Daniel P. Berrangé (2):
crypto: avoid overwriting Error object erasing keyslot
crypto: add newline in error hint messages
crypto/block-luks.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
--
2.56.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 1/2] crypto: avoid overwriting Error object erasing keyslot
2026-10-26 11:12 [PATCH v2 0/2] crypto: fix handling & reporting of errors when erasing keyslots Daniel P. Berrangé
@ 2026-10-26 11:12 ` Daniel P. Berrangé
2026-10-26 11:51 ` Markus Armbruster
2026-10-27 14:27 ` marcandre.lureau
2026-10-26 11:12 ` [PATCH v2 2/2] crypto: add newline in error hint messages Daniel P. Berrangé
1 sibling, 2 replies; 7+ messages in thread
From: Daniel P. Berrangé @ 2026-10-26 11:12 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, Markus Armbruster, Daniel P. Berrangé
When erasing a keyslot we deliberately ignore some errors and
carry on trying to erase as much as possible. This results in
overwriting Error objects and triggering an assertion. Don't
pass in the &local_err, if errp is already set.
Fixes: https://gitlab.com/qemu-project/qemu/-/work_items/4697
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
crypto/block-luks.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/crypto/block-luks.c b/crypto/block-luks.c
index 0926ad28f0c..277a5110607 100644
--- a/crypto/block-luks.c
+++ b/crypto/block-luks.c
@@ -1152,6 +1152,7 @@ qcrypto_block_luks_erase_key(QCryptoBlock *block,
if (ret < 0) {
error_propagate(errp, local_err);
+ local_err = NULL;
}
/*
* Now try to erase the key material, even if the header
@@ -1169,6 +1170,7 @@ qcrypto_block_luks_erase_key(QCryptoBlock *block,
if (i > 0) {
return -1;
}
+ local_err = NULL;
}
if (writefunc(block,
slot->key_offset_sector * QCRYPTO_BLOCK_LUKS_SECTOR_SIZE,
--
2.56.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 2/2] crypto: add newline in error hint messages
2026-10-26 11:12 [PATCH v2 0/2] crypto: fix handling & reporting of errors when erasing keyslots Daniel P. Berrangé
2026-10-26 11:12 ` [PATCH v2 1/2] crypto: avoid overwriting Error object erasing keyslot Daniel P. Berrangé
@ 2026-10-26 11:12 ` Daniel P. Berrangé
2026-10-26 11:51 ` Markus Armbruster
2026-10-27 14:27 ` marcandre.lureau
1 sibling, 2 replies; 7+ messages in thread
From: Daniel P. Berrangé @ 2026-10-26 11:12 UTC (permalink / raw)
To: qemu-devel; +Cc: marcandre.lureau, Markus Armbruster, Daniel P. Berrangé
The error_append_hint() API contract requires messages to end with
a newline character.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
crypto/block-luks.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/crypto/block-luks.c b/crypto/block-luks.c
index 277a5110607..f7217ad7b77 100644
--- a/crypto/block-luks.c
+++ b/crypto/block-luks.c
@@ -1674,7 +1674,7 @@ qcrypto_block_luks_amend_add_keyslot(QCryptoBlock *block,
if (qcrypto_block_luks_find_key(block, old_password, master_key,
readfunc, opaque, errp) < 0) {
- error_append_hint(errp, "Failed to retrieve the master key");
+ error_append_hint(errp, "Failed to retrieve the master key\n");
return -1;
}
@@ -1687,7 +1687,7 @@ qcrypto_block_luks_amend_add_keyslot(QCryptoBlock *block,
/* Now set the new keyslots */
if (qcrypto_block_luks_store_key(block, keyslot, new_password, master_key,
iter_time, writefunc, opaque, errp)) {
- error_append_hint(errp, "Failed to write to keyslot %i", keyslot);
+ error_append_hint(errp, "Failed to write to keyslot %i\n", keyslot);
return -1;
}
return 0;
@@ -1785,7 +1785,7 @@ qcrypto_block_luks_amend_erase_keyslots(QCryptoBlock *block,
if (qcrypto_block_luks_erase_key(block, keyslot,
writefunc, opaque, errp)) {
- error_append_hint(errp, "Failed to erase keyslot %i", keyslot);
+ error_append_hint(errp, "Failed to erase keyslot %i\n", keyslot);
return -1;
}
@@ -1838,7 +1838,7 @@ qcrypto_block_luks_amend_erase_keyslots(QCryptoBlock *block,
}
if (qcrypto_block_luks_erase_key(block, i, writefunc,
opaque, errp)) {
- error_append_hint(errp, "Failed to erase keyslot %zu", i);
+ error_append_hint(errp, "Failed to erase keyslot %zu\n", i);
return -1;
}
}
--
2.56.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 1/2] crypto: avoid overwriting Error object erasing keyslot
2026-10-26 11:12 ` [PATCH v2 1/2] crypto: avoid overwriting Error object erasing keyslot Daniel P. Berrangé
@ 2026-10-26 11:51 ` Markus Armbruster
2026-10-27 14:27 ` marcandre.lureau
1 sibling, 0 replies; 7+ messages in thread
From: Markus Armbruster @ 2026-10-26 11:51 UTC (permalink / raw)
To: Daniel P. Berrangé; +Cc: qemu-devel, marcandre.lureau
Daniel P. Berrangé <berrange@redhat.com> writes:
> When erasing a keyslot we deliberately ignore some errors and
> carry on trying to erase as much as possible. This results in
> overwriting Error objects and triggering an assertion. Don't
> pass in the &local_err, if errp is already set.
>
> Fixes: https://gitlab.com/qemu-project/qemu/-/work_items/4697
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
> crypto/block-luks.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/crypto/block-luks.c b/crypto/block-luks.c
> index 0926ad28f0c..277a5110607 100644
> --- a/crypto/block-luks.c
> +++ b/crypto/block-luks.c
> @@ -1152,6 +1152,7 @@ qcrypto_block_luks_erase_key(QCryptoBlock *block,
{
QCryptoBlockLUKS *luks = block->opaque;
QCryptoBlockLUKSKeySlot *slot;
g_autofree uint8_t *garbagesplitkey = NULL;
size_t splitkeylen;
size_t i;
Error *local_err = NULL;
int ret;
assert(slot_idx < QCRYPTO_BLOCK_LUKS_NUM_KEY_SLOTS);
slot = &luks->header.key_slots[slot_idx];
splitkeylen = luks->header.master_key_len * slot->stripes;
assert(splitkeylen > 0);
garbagesplitkey = g_new0(uint8_t, splitkeylen);
/* Reset the key slot header */
memset(slot->salt, 0, QCRYPTO_BLOCK_LUKS_SALT_LEN);
slot->iterations = 0;
slot->active = QCRYPTO_BLOCK_LUKS_KEY_SLOT_DISABLED;
ret = qcrypto_block_luks_store_header(block, writefunc,
opaque, &local_err);
Why not pass @errp here, and ...
>
> if (ret < 0) {
> error_propagate(errp, local_err);
... drop this line?
> + local_err = NULL;
> }
Suggest a blank line here.
Note for later: @errp may be non-null now.
> /*
> * Now try to erase the key material, even if the header
> @@ -1169,6 +1170,7 @@ qcrypto_block_luks_erase_key(QCryptoBlock *block,
* update failed
*/
for (i = 0; i < QCRYPTO_BLOCK_LUKS_ERASE_ITERATIONS; i++) {
if (qcrypto_random_bytes(garbagesplitkey,
splitkeylen, &local_err) < 0) {
/*
* If we failed to get the random data, still write
* at least zeros to the key slot at least once
*/
error_propagate(errp, local_err);
If @errp is still null, store this error, else ignore it.
> if (i > 0) {
> return -1;
Stop when erasing non-first key slot failed.
> }
> + local_err = NULL;
> }
> if (writefunc(block,
> slot->key_offset_sector * QCRYPTO_BLOCK_LUKS_SECTOR_SIZE,
garbagesplitkey,
splitkeylen,
opaque,
&local_err) < 0) {
error_propagate(errp, local_err);
We do need error_propagate() here, because @errp can be non-null.
return -1;
}
}
return ret;
}
Nothing is wrong, so
Reviewed-by: Markus Armbruster <armbru@redhat.com>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/2] crypto: add newline in error hint messages
2026-10-26 11:12 ` [PATCH v2 2/2] crypto: add newline in error hint messages Daniel P. Berrangé
@ 2026-10-26 11:51 ` Markus Armbruster
2026-10-27 14:27 ` marcandre.lureau
1 sibling, 0 replies; 7+ messages in thread
From: Markus Armbruster @ 2026-10-26 11:51 UTC (permalink / raw)
To: Daniel P. Berrangé; +Cc: qemu-devel, marcandre.lureau
Daniel P. Berrangé <berrange@redhat.com> writes:
> The error_append_hint() API contract requires messages to end with
> a newline character.
>
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/2] crypto: add newline in error hint messages
2026-10-26 11:12 ` [PATCH v2 2/2] crypto: add newline in error hint messages Daniel P. Berrangé
2026-10-26 11:51 ` Markus Armbruster
@ 2026-10-27 14:27 ` marcandre.lureau
1 sibling, 0 replies; 7+ messages in thread
From: marcandre.lureau @ 2026-10-27 14:27 UTC (permalink / raw)
To: Daniel P. Berrangé; +Cc: qemu-devel, marcandre.lureau, Markus Armbruster
On Mon, 26 Oct 2026 11:12:37 +0000, Daniel P. Berrangé <berrange@redhat.com> wrote:
> The error_append_hint() API contract requires messages to end with
> a newline character.
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
--
Marc-André Lureau <marcandre.lureau@redhat.com>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 1/2] crypto: avoid overwriting Error object erasing keyslot
2026-10-26 11:12 ` [PATCH v2 1/2] crypto: avoid overwriting Error object erasing keyslot Daniel P. Berrangé
2026-10-26 11:51 ` Markus Armbruster
@ 2026-10-27 14:27 ` marcandre.lureau
1 sibling, 0 replies; 7+ messages in thread
From: marcandre.lureau @ 2026-10-27 14:27 UTC (permalink / raw)
To: Daniel P. Berrangé; +Cc: qemu-devel, marcandre.lureau, Markus Armbruster
> When erasing a keyslot we deliberately ignore some errors and
> carry on trying to erase as much as possible. This results in
> overwriting Error objects and triggering an assertion. Don't
> pass in the &local_err, if errp is already set.
>
> Fixes: https://gitlab.com/qemu-project/qemu/-/work_items/4697
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> Message-ID: <20261026111237.660633-2-berrange@redhat.com>
> ---
> crypto/block-luks.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/crypto/block-luks.c b/crypto/block-luks.c
> index 0926ad28f0cd..277a51106072 100644
> --- a/crypto/block-luks.c
> +++ b/crypto/block-luks.c
> @@ -1152,6 +1152,7 @@ qcrypto_block_luks_erase_key(QCryptoBlock *block,
>
> if (ret < 0) {
> error_propagate(errp, local_err);
> + local_err = NULL;
> }
> /*
> * Now try to erase the key material, even if the header
> @@ -1169,6 +1170,7 @@ qcrypto_block_luks_erase_key(QCryptoBlock *block,
> if (i > 0) {
> return -1;
> }
> + local_err = NULL;
This is the recoverable path: the comment says we still write zeros and
carry on, so a first-iteration random failure is not meant to be fatal. But
error_propagate(errp, local_err) has just stored that error in *errp.
Keep the first-iteration failure as non-fatal but do not hand it to errp?
(e.g. error_free(local_err) instead of error_propagate() when i == 0)
--
Marc-André Lureau <marcandre.lureau@redhat.com>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-10-27 14:28 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-26 11:12 [PATCH v2 0/2] crypto: fix handling & reporting of errors when erasing keyslots Daniel P. Berrangé
2026-10-26 11:12 ` [PATCH v2 1/2] crypto: avoid overwriting Error object erasing keyslot Daniel P. Berrangé
2026-10-26 11:51 ` Markus Armbruster
2026-10-27 14:27 ` marcandre.lureau
2026-10-26 11:12 ` [PATCH v2 2/2] crypto: add newline in error hint messages Daniel P. Berrangé
2026-10-26 11:51 ` Markus Armbruster
2026-10-27 14:27 ` marcandre.lureau
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.