Message ID | Z9N8BsVJF-s6Hcvd@kspp (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [next] rtc: Avoid a couple of -Wflex-array-member-not-at-end warnings | expand |
On Fri, Mar 14, 2025 at 11:14:54AM +1030, Gustavo A. R. Silva wrote: > 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)); 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; > > 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)); Same here, how about: ((struct ec_response_rtc *)msg->data)->time = param;
> 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
diff --git a/drivers/rtc/rtc-cros-ec.c b/drivers/rtc/rtc-cros-ec.c index 865c2e82c7a5..9144bc12e0b7 100644 --- a/drivers/rtc/rtc-cros-ec.c +++ b/drivers/rtc/rtc-cros-ec.c @@ -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;
-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] Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org> --- drivers/rtc/rtc-cros-ec.c | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-)