Re: [PATCH] hw/display/virtio-gpu: Fix empty blob discrimination

Akihiko Odaki <[email protected]>
Newsgroups gmane.comp.emulators.qemu.stable,gmane.comp.emulators.qemu
Message-ID <[email protected]>
On 2026/07/28 6:35, Michael Tokarev wrote:
> On 7/25/26 10:12, Akihiko Odaki wrote:
>> Discriminating blobs by checking whether blob_size is nonzero fails for
>> empty blobs. Identify 2D resources by their non-NULL image instead.
>>
>> Fixes: bdd53f739273 ("virtio-gpu: Update cursor data using blob")
>> Fixes: f66767f75c9c ("virtio-gpu: add virtio-gpu/blob vmstate 
>> subsection")
>> Signed-off-by: Akihiko Odaki <[email protected]>
>> ---
>>   hw/display/virtio-gpu.c | 18 +++++++++---------
>>   1 file changed, 9 insertions(+), 9 deletions(-)
> 
> Is this a qemu-stable material?  I've no idea from the description
> about the implication of the previous behavior.

This fix is not important nor a regression but you may still pick it.

The consequence of the bug this patch fixes is a NULL pointer 
dereference and denial-of-service. docs/devel/stable-process.rst says:

 > Generally, the following patches are considered stable material:
 >
 > * Patches that fix severe issues, like fixes for CVEs
 >
 > * Patches that fix regressions

And I don't think this match with the description. It still does fix a 
bug, and I think you can cleanly backport it and you tend to backport 
such a patch.

Regards,
Akihiko Odaki

> 
> Thanks,
> 
> /mjt
> 
>> diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
>> index 718ba3039290..6413df029b8e 100644
>> --- a/hw/display/virtio-gpu.c
>> +++ b/hw/display/virtio-gpu.c
>> @@ -56,18 +56,18 @@ void virtio_gpu_update_cursor_data(VirtIOGPU *g,
>>           return;
>>       }
>> -    if (res->blob_size) {
>> -        if (res->blob_size < (s->current_cursor->width *
>> -                              s->current_cursor->height * 4)) {
>> -            return;
>> -        }
>> -        data = res->blob;
>> -    } else {
>> +    if (res->image) {
>>           if (pixman_image_get_width(res->image)  != s- 
>> >current_cursor->width ||
>>               pixman_image_get_height(res->image) != s- 
>> >current_cursor->height) {
>>               return;
>>           }
>>           data = pixman_image_get_data(res->image);
>> +    } else {
>> +        if (res->blob_size < (s->current_cursor->width *
>> +                              s->current_cursor->height * 4)) {
>> +            return;
>> +        }
>> +        data = res->blob;
>>       }
>>       pixels = s->current_cursor->width * s->current_cursor->height;
>> @@ -1279,7 +1279,7 @@ static int virtio_gpu_save(QEMUFile *f, void 
>> *opaque, size_t size,
>>       assert(QTAILQ_EMPTY(&g->cmdq));
>>       QTAILQ_FOREACH(res, &g->reslist, next) {
>> -        if (res->blob_size) {
>> +        if (!res->image) {
>>               continue;
>>           }
>>           qemu_put_be32(f, res->resource_id);
>> @@ -1430,7 +1430,7 @@ static int virtio_gpu_blob_save(QEMUFile *f, 
>> void *opaque, size_t size,
>>       assert(QTAILQ_EMPTY(&g->cmdq));
>>       QTAILQ_FOREACH(res, &g->reslist, next) {
>> -        if (!res->blob_size) {
>> +        if (res->image) {
>>               continue;
>>           }
>>           assert(!res->image);
>>
>> ---
>> base-commit: 006a22cb26998998385b104db1ff9466ef2f3153
>> change-id: 20260725-image-6c8566fb1253
>>
>> Best regards,
>> -- 
>> Akihiko Odaki <[email protected]>
>>
>>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.