]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/imagination: Fix returned size for DRM_IOCTL_PVR_DEV_QUERY
authorBrajesh Gupta <brajesh.gupta@imgtec.com>
Wed, 1 Jul 2026 05:19:30 +0000 (10:49 +0530)
committerAlessio Belle <alessio.belle@imgtec.com>
Thu, 2 Jul 2026 10:15:59 +0000 (11:15 +0100)
For a few subtypes of DRM_IOCTL_PVR_DEV_QUERY, driver was overriding
the returned size unconditionally. This would have resulted in
increase of reported size beyond the amount of data returned to
userspace when args->size < size of query structure.

Updated behaviour matches with the description of
drm_pvr_ioctl_dev_query_args.size and written byte length.
None of the structures of DRM_IOCTL_PVR_DEV_QUERY changed after addition,
so change will not break any compatibility with earlier version.

Fixes: f99f5f3ea7ef ("drm/imagination: Add GPU ID parsing and firmware loading")
Fixes: ff5f643de0bf ("drm/imagination: Add GEM and VM related code")
Signed-off-by: Brajesh Gupta <brajesh.gupta@imgtec.com>
Reviewed-by: Alessio Belle <alessio.belle@imgtec.com>
Link: https://patch.msgid.link/20260701-b4-b4-query-v2-1-a1b491387875@imgtec.com
Signed-off-by: Alessio Belle <alessio.belle@imgtec.com>
drivers/gpu/drm/imagination/pvr_drv.c
drivers/gpu/drm/imagination/pvr_vm.c

index b20c462bcba0ba4822e4f772467a0e8fe3e07514..091e9b4873e101841868d3be700a4ba2e95fadda 100644 (file)
@@ -515,7 +515,8 @@ copy_out:
        if (err < 0)
                return err;
 
-       args->size = sizeof(query);
+       if (args->size > sizeof(query))
+               args->size = sizeof(query);
        return 0;
 }
 
@@ -596,7 +597,8 @@ copy_out:
        if (err < 0)
                return err;
 
-       args->size = sizeof(query);
+       if (args->size > sizeof(query))
+               args->size = sizeof(query);
        return 0;
 }
 
index e1ec60f34b6e64ed6519c8b40aacb179164de0f9..396d349fb6ce48a91be2bac369b3be02980dbacb 100644 (file)
@@ -1019,7 +1019,8 @@ copy_out:
        if (err < 0)
                return err;
 
-       args->size = sizeof(query);
+       if (args->size > sizeof(query))
+               args->size = sizeof(query);
        return 0;
 }
 
@@ -1069,7 +1070,8 @@ copy_out:
        if (err < 0)
                return err;
 
-       args->size = sizeof(query);
+       if (args->size > sizeof(query))
+               args->size = sizeof(query);
        return 0;
 }