]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iommufd/selftest: Make it clearer to gcc that the access is not out of bounds
authorJason Gunthorpe <jgg@nvidia.com>
Fri, 5 Dec 2025 18:56:12 +0000 (14:56 -0400)
committerJason Gunthorpe <jgg@nvidia.com>
Tue, 16 Dec 2025 00:34:41 +0000 (20:34 -0400)
GCC gets a bit confused and reports:

   In function '_test_cmd_get_hw_info',
       inlined from 'iommufd_ioas_get_hw_info' at iommufd.c:779:3,
       inlined from 'wrapper_iommufd_ioas_get_hw_info' at iommufd.c:752:1:
>> iommufd_utils.h:804:37: warning: array subscript 'struct iommu_test_hw_info[0]' is partly outside array bounds of 'struct iommu_test_hw_info_buffer_smaller[1]' [-Warray-bounds=]
     804 |                         assert(!info->flags);
         |                                 ~~~~^~~~~~~
   iommufd.c: In function 'wrapper_iommufd_ioas_get_hw_info':
   iommufd.c:761:11: note: object 'buffer_smaller' of size 4
     761 |         } buffer_smaller;
         |           ^~~~~~~~~~~~~~

While it is true that "struct iommu_test_hw_info[0]" is partly out of
bounds of the input pointer, it is not true that info->flags is out of
bounds. Unclear why it warns on this.

Reuse an existing properly sized stack buffer and pass a truncated length
instead to test the same thing.

Fixes: af4fde93c319 ("iommufd/selftest: Add coverage for IOMMU_GET_HW_INFO ioctl")
Link: https://patch.msgid.link/r/0-v1-63a2cffb09da+4486-iommufd_gcc_bounds_jgg@nvidia.com
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202512032344.kaAcKFIM-lkp@intel.com/
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
tools/testing/selftests/iommu/iommufd.c

index 10e051b6f592df4999dcacb9e8e5a2c833f08e29..dadad277f4eb2ee3fd85a080ea05c9103bf92a71 100644 (file)
@@ -755,9 +755,6 @@ TEST_F(iommufd_ioas, get_hw_info)
                struct iommu_test_hw_info info;
                uint64_t trailing_bytes;
        } buffer_larger;
-       struct iommu_test_hw_info_buffer_smaller {
-               __u32 flags;
-       } buffer_smaller;
 
        if (self->device_id) {
                uint8_t max_pasid = 0;
@@ -789,8 +786,9 @@ TEST_F(iommufd_ioas, get_hw_info)
                 * the fields within the size range still gets updated.
                 */
                test_cmd_get_hw_info(self->device_id,
-                                    IOMMU_HW_INFO_TYPE_DEFAULT,
-                                    &buffer_smaller, sizeof(buffer_smaller));
+                                    IOMMU_HW_INFO_TYPE_DEFAULT, &buffer_exact,
+                                    offsetofend(struct iommu_test_hw_info,
+                                                flags));
                test_cmd_get_hw_info_pasid(self->device_id, &max_pasid);
                ASSERT_EQ(0, max_pasid);
                if (variant->pasid_capable) {