rtc: Avoid a couple of -Wflex-array-member-not-at-end warnings
Subsystems (2)
PATCH 1/1 rtc: Avoid a couple of -Wflex-array-member-not-at-end warnings
-Wflex-array-member-not-at-end was introduced in GCC-14, and we are getting ready to enable it, globally.
Use the DEFINE_RAW_FLEX() helper for an on-stack definition of a flexible structure where the size of the flexible-array member is known at compile-time, and refactor the rest of the code, accordingly.
So, with these changes, fix the following warnings:
drivers/rtc/rtc-cros-ec.c:62:40: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end] drivers/rtc/rtc-cros-ec.c:40:40: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]
--- drivers/rtc/rtc-cros-ec.c | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-)
drivers/rtc/rtc-cros-ec.c +12 -18
@@ -35,21 +35,18 @@ struct cros_ec_rtc {static int cros_ec_rtc_get (struct cros_ec_device *cros_ec,u32 command,u32 *response) { + DEFINE_RAW_FLEX(struct cros_ec_command, msg, data, + sizeof(struct ec_response_rtc));int ret; -struct { -struct cros_ec_command msg; -struct ec_response_rtc data; - } __packed msg; -memset (&msg,0 ,sizeof (msg)); - msg.msg.command = command; - msg.msg.insize =sizeof (msg.data); + msg->command = command; + msg->insize =sizeof (struct ec_response_rtc ); - ret =cros_ec_cmd_xfer_status (cros_ec, &msg.msg); + ret =cros_ec_cmd_xfer_status (cros_ec, msg);if (ret <0 )return ret; - *response = msg.data.time; +memcpy (response, msg->data,sizeof (*response));return 0 ; }
@@ -57,18 +54,15 @@ static int cros_ec_rtc_get(struct cros_ec_device *cros_ec, u32 command,static int cros_ec_rtc_set (struct cros_ec_device *cros_ec,u32 command,u32 param) { + DEFINE_RAW_FLEX(struct cros_ec_command, msg, data, + sizeof(struct ec_response_rtc));int ret; -struct { -struct cros_ec_command msg; -struct ec_response_rtc data; - } __packed msg; -memset (&msg,0 ,sizeof (msg)); - msg.msg.command = command; - msg.msg.outsize =sizeof (msg.data); - msg.data.time = param; + msg->command = command; + msg->outsize =sizeof (struct ec_response_rtc ); +memcpy (msg->data, ¶m,sizeof (param)); - ret =cros_ec_cmd_xfer_status (cros_ec, &msg.msg); + ret =cros_ec_cmd_xfer_status (cros_ec, msg);if (ret <0 )return ret;return 0 ;
Signature · 1 line
2.43.0
Quoted 14 lines · Gustavo A. R. Silva
static int cros_ec_rtc_get(struct
cros_ec_device*cros_ec, u32 command,drivers/rtc/rtc-cros-ec.c +2
-7u32 *response) { + DEFINE_RAW_FLEX(struct cros_ec_command, msg, data, + sizeof(struct ec_response_rtc));int ret; -struct { -struct cros_ec_command msg; -struct ec_response_rtc data; - } __packed msg; -memset (&msg,0 ,sizeof (msg)); - msg.msg.command = command; - msg.msg.insize =sizeof (msg.data);
drivers/rtc/rtc-cros-ec.c struct cros_ec_rtc { · line 49
Quoted 10 lines
drivers/rtc/rtc-cros-ec.c +4
-2+ msg->command = command; + msg->insize =sizeof (struct ec_response_rtc ); - ret =cros_ec_cmd_xfer_status (cros_ec, &msg.msg); + ret =cros_ec_cmd_xfer_status (cros_ec, msg);if (ret <0 )return ret; - *response = msg.data.time; +memcpy (response, msg->data,sizeof (*response));
Technically they are the same as struct ec_response_rtc only has an u32 member. Any reason to not translate it something similar to:
*response = ((struct ec_response_rtc *)msg->data)->time;
Quoted 12 lines
drivers/rtc/rtc-cros-ec.c +2
-2return 0 ; }@@ -57,18 +54,15 @@ static int cros_ec_rtc_get(struct cros_ec_device *cros_ec, u32 command,static int cros_ec_rtc_set (struct cros_ec_device *cros_ec,u32 command,u32 param) { + DEFINE_RAW_FLEX(struct cros_ec_command, msg, data, + sizeof(struct ec_response_rtc));int ret; -struct { -struct cros_ec_command msg;
drivers/rtc/rtc-cros-ec.c static int cros_ec_rtc_get(struct cros_ec_device *cros_ec, u32 command, · line 63
Quoted 10 lines
drivers/rtc/rtc-cros-ec.c +3
-6-struct ec_response_rtc data; - }__packed msg; -memset (&msg,0 ,sizeof (msg)); - msg.msg.command = command; - msg.msg.outsize =sizeof (msg.data); - msg.data.time = param; + msg->command = command; + msg->outsize =sizeof (struct ec_response_rtc ); +memcpy (msg->data, ¶m,sizeof (param));
Same here, how about:
((struct ec_response_rtc *)msg->data)->time = param;
Quoted 4 lines
Same here, how about:
((struct
ec_response_rtc*)msg->data)->time = param;
Yeah, let's go with that then :)
https://lore.kernel.org/linux-hardening/Z9PpPg06OK8ghNvm@kspp/
Thanks!
--
Gustavo