media: venus: hfi_cmds: Replace fake flex-array with flexible-array member
authorGustavo A. R. Silva <gustavoars@kernel.org>
Wed, 17 May 2023 01:03:39 +0000 (02:03 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Fri, 9 Jun 2023 12:43:18 +0000 (13:43 +0100)
One-element arrays are deprecated, and we are replacing them with flexible
array members instead. So, replace one-element arrays with flexible-array
members in struct hfi_sys_set_resource_pkt, and refactor the rest of
the code, accordingly.

This helps with the ongoing efforts to tighten the FORTIFY_SOURCE
routines on memcpy() and help us make progress towards globally
enabling -fstrict-flex-arrays=3 [1].

The only binary differences seen before/after changes are the
following:

     17ba:      mov    %rbx,%rdi
     17bd:      call   17c2 <pkt_sys_set_resource+0x42>
                        17be: R_X86_64_PLT32    __tsan_write4-0x4
-    17c2:      movl   $0x14,(%rbx)
+    17c2:      movl   $0x10,(%rbx)
     17c8:      lea    0x4(%rbx),%rdi
     17cc:      call   17d1 <pkt_sys_set_resource+0x51>
                        17cd: R_X86_64_PLT32    __tsan_write4-0x4

which is expected once this accounts for the following line of code
at  drivers/media/platform/qcom/venus/hfi_cmds.c:73

73         pkt->hdr.size = sizeof(*pkt);

and as *pkt is of type struct hfi_sys_set_resource_pkt, sizeof(*pkt) is
reduced by 4 bytes, due to the flex-array transformation.

Link: https://github.com/KSPP/linux/issues/79
Link: https://github.com/KSPP/linux/issues/293
Link: https://gcc.gnu.org/pipermail/gcc-patches/2022-October/602902.html
Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Signed-off-by: Stanimir Varbanov <stanimir.k.varbanov@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/platform/qcom/venus/hfi_cmds.c
drivers/media/platform/qcom/venus/hfi_cmds.h

index bc3f8ff058403ca3d7ac1df1bcf86b85faa88a74..33474f718398e30141d4ffcd7faffd0501236293 100644 (file)
@@ -83,7 +83,7 @@ int pkt_sys_set_resource(struct hfi_sys_set_resource_pkt *pkt, u32 id, u32 size,
                res->size = size;
                res->mem = addr;
                pkt->resource_type = HFI_RESOURCE_OCMEM;
-               pkt->hdr.size += sizeof(*res) - sizeof(u32);
+               pkt->hdr.size += sizeof(*res);
                break;
        }
        case VIDC_RESOURCE_NONE:
index 99bc0b6db67c3f24d4fb9fa16a77adcc213ad917..fa2cb1ac467008bb242f2c419dd280e62acc9019 100644 (file)
@@ -56,7 +56,7 @@ struct hfi_sys_set_resource_pkt {
        struct hfi_pkt_hdr hdr;
        u32 resource_handle;
        u32 resource_type;
-       u32 resource_data[1];
+       u32 resource_data[];
 };
 
 struct hfi_sys_release_resource_pkt {