Skip to contentSkip to conversation

firmware: arm_ffa: avoid string-fortify warningn in export_uuid()

PATCH New Arnd Bergmann 1 participant 1 message Sep 9, 2024 Firmware framework for ARMV8-a

lore
Share & tools
lore
#0 lore raw

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.

Fixes aaef3bc98129 ("firmware: arm_ffa: Add support for FFA_MSG_SEND_DIRECT_{REQ,RESP}2")

---
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
index 4d231bc375e0..8dd81db9b071 100644
@@ -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