firmware: arm_ffa: avoid string-fortify warningn in export_uuid()
PATCH 1/1 firmware: arm_ffa: avoid string-fortify warningn in export_uuid()
From: Arnd Bergmann <[email protected]>
Copying to a 16 byte structure into an 8-byte struct member causes a compile-time warning:
In file included from drivers/firmware/arm_ffa/driver.c:25:
In function 'fortify_memcpy_chk',
inlined from 'export_uuid' at include/linux/uuid.h:88:2,
inlined from 'ffa_msg_send_direct_req2' at drivers/firmware/arm_ffa/driver.c:488:2:include/linux/fortify-string.h:571:25: error: call to '__write_overflow_field' declared with attribute warning: detected write beyond size of field (1st parameter); maybe use struct_group()? [-Werror=attribute-warning]
571 | __write_overflow_field(p_size_field, size);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Use a union for the conversion instead and make sure the byte order is fixed in the process.
---
Not sure how endianess is handled in the ABI, adding the conversion seemed sensible here to allow big-endian kernels on a little-endian firmware, but it's possible that ff-a is already required to do the byte swapping in this case.
--- drivers/firmware/arm_ffa/driver.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
drivers/firmware/arm_ffa/driver.c +8 -3
@@ -481,11 +481,16 @@ static int ffa_msg_send_direct_req2(u16 src_id, u16 dst_id, const uuid_t *uuid, struct ffa_send_direct_data2 *data) {u32 src_dst_ids =PACK_TARGET_INFO (src_id, dst_id); +union { +uuid_t uuid; +__le64 regs[2 ]; + } uuid_regs = { .uuid = *uuid };ffa_value_t ret, args = { - .a0 =FFA_MSG_SEND_DIRECT_REQ2 , .a1 = src_dst_ids, + .a0 =FFA_MSG_SEND_DIRECT_REQ2 , + .a1 = src_dst_ids, + .a2 =le64_to_cpu (uuid_regs.regs[0 ]), + .a3 =le64_to_cpu (uuid_regs.regs[1 ]), }; - -export_uuid ((u8 *)&args.a2, uuid);memcpy ((void *)&args + offsetof(ffa_value_t , a4), data,sizeof (*data));invoke_ffa_fn (args, &ret);
Signature · 1 line
2.39.2