[PATCH] qdev: fix error handling in set_uint64_checkmask

Zesen Liu posted 1 patch 1 day, 9 hours ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20251217-qdev-fix-v1-1-bd33ea463220@gmail.com
Maintainers: Paolo Bonzini <pbonzini@redhat.com>, "Daniel P. Berrangé" <berrange@redhat.com>, Eduardo Habkost <eduardo@habkost.net>
hw/core/qdev-properties.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
[PATCH] qdev: fix error handling in set_uint64_checkmask
Posted by Zesen Liu 1 day, 9 hours ago
When specifying lbr_fmt=VALUE in cpu options with an invalid VALUE, error_setg() gets triggered twice, causing an assertion failure in error_setv() which requires *errp to be NULL, preventing meaningful error messages from being displayed.

Fix this by checking visit_type_uint64()'s return value and returning early on failure, consistent with other property setters like set_string().

Signed-off-by: Zesen Liu <ftyghome@gmail.com>
---
 hw/core/qdev-properties.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 422a486969..0930d64252 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -494,7 +494,9 @@ static void set_uint64_checkmask(Object *obj, Visitor *v, const char *name,
     const Property *prop = opaque;
     uint64_t *ptr = object_field_prop_ptr(obj, prop);
 
-    visit_type_uint64(v, name, ptr, errp);
+    if (!visit_type_uint64(v, name, ptr, errp)) {
+        return;
+    }
     if (*ptr & ~prop->bitmask) {
         error_setg(errp, "Property value for '%s' has bits outside mask '0x%" PRIx64 "'",
                    name, prop->bitmask);

---
base-commit: 7154e4df40468012fccb6687ecd2b288c56a4a2d
change-id: 20251217-qdev-fix-207bea2b8a14

Best regards,
-- 
Zesen Liu <ftyghome@gmail.com>
Re: [PATCH] qdev: fix error handling in set_uint64_checkmask
Posted by Markus Armbruster 1 day, 5 hours ago
Zesen Liu <ftyghome@gmail.com> writes:

> When specifying lbr_fmt=VALUE in cpu options with an invalid VALUE, error_setg() gets triggered twice, causing an assertion failure in error_setv() which requires *errp to be NULL, preventing meaningful error messages from being displayed.
>
> Fix this by checking visit_type_uint64()'s return value and returning early on failure, consistent with other property setters like set_string().
>

Let's add

  Fixes: 18c22d7112a7 (qdev-properties: Add a new macro with bitmask check for uint64_t property)
  Cc: qemu-stable@nongnu.org

> Signed-off-by: Zesen Liu <ftyghome@gmail.com>
> ---
>  hw/core/qdev-properties.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
> index 422a486969..0930d64252 100644
> --- a/hw/core/qdev-properties.c
> +++ b/hw/core/qdev-properties.c
> @@ -494,7 +494,9 @@ static void set_uint64_checkmask(Object *obj, Visitor *v, const char *name,
>      const Property *prop = opaque;
>      uint64_t *ptr = object_field_prop_ptr(obj, prop);
>  
> -    visit_type_uint64(v, name, ptr, errp);
> +    if (!visit_type_uint64(v, name, ptr, errp)) {
> +        return;
> +    }
>      if (*ptr & ~prop->bitmask) {
>          error_setg(errp, "Property value for '%s' has bits outside mask '0x%" PRIx64 "'",
>                     name, prop->bitmask);

Reviewed-by: Markus Armbruster <armbru@redhat.com>

We haven't tagged rc4.  I'll post a PR right away, so we have a chance
to get this fix into 10.2.
Re: [PATCH] qdev: fix error handling in set_uint64_checkmask
Posted by Zesen Liu 1 day, 5 hours ago
Thanks for the review and for updating the tags. :)

> On Dec 17, 2025, at 16:22, Markus Armbruster <armbru@redhat.com> wrote:
> 
> Zesen Liu <ftyghome@gmail.com> writes:
> 
>> When specifying lbr_fmt=VALUE in cpu options with an invalid VALUE, error_setg() gets triggered twice, causing an assertion failure in error_setv() which requires *errp to be NULL, preventing meaningful error messages from being displayed.
>> 
>> Fix this by checking visit_type_uint64()'s return value and returning early on failure, consistent with other property setters like set_string().
>> 
> 
> Let's add
> 
>  Fixes: 18c22d7112a7 (qdev-properties: Add a new macro with bitmask check for uint64_t property)
>  Cc: qemu-stable@nongnu.org
> 
>> Signed-off-by: Zesen Liu <ftyghome@gmail.com>
>> ---
>> hw/core/qdev-properties.c | 4 +++-
>> 1 file changed, 3 insertions(+), 1 deletion(-)
>> 
>> diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
>> index 422a486969..0930d64252 100644
>> --- a/hw/core/qdev-properties.c
>> +++ b/hw/core/qdev-properties.c
>> @@ -494,7 +494,9 @@ static void set_uint64_checkmask(Object *obj, Visitor *v, const char *name,
>>     const Property *prop = opaque;
>>     uint64_t *ptr = object_field_prop_ptr(obj, prop);
>> 
>> -    visit_type_uint64(v, name, ptr, errp);
>> +    if (!visit_type_uint64(v, name, ptr, errp)) {
>> +        return;
>> +    }
>>     if (*ptr & ~prop->bitmask) {
>>         error_setg(errp, "Property value for '%s' has bits outside mask '0x%" PRIx64 "'",
>>                    name, prop->bitmask);
> 
> Reviewed-by: Markus Armbruster <armbru@redhat.com>
> 
> We haven't tagged rc4.  I'll post a PR right away, so we have a chance
> to get this fix into 10.2.
>