[PATCH] staging: greybus: replace zero-element array with flexible-array
From: Jaehee Park
Date: Mon Apr 11 2022 - 17:14:28 EST
Zero-length and one-element arrays are deprecated. Flexible-array
members should be used instead. Flexible-array members are
recommended because this is the way the kernel expects dynamically
sized trailing elements to be declared.
Refer to Documentation/process/deprecated.rst.
Change the zero-length array, buf, in the struct
gb_usb_hub_control_response to a flexible array. And add wLength as a
member of the struct so that the struct is not a zero-sized struct.
Issue found by flexible_array coccinelle script.
Signed-off-by: Jaehee Park <jhpark1013@xxxxxxxxx>
---
I have a question for the authors:
I saw a fixme comment in the hub_control function in usb.c:
/ FIXME: handle unspecified lengths /
I was wondering why this comment was left there?
In this patch, I'm using this struct:
struct gb_usb_hub_control_response {
__le16 wLength;
u8 buf[];
};
And instead of using response_size, I'm doing this:
struct gb_usb_hub_control_response *response;
And using sizeof(*response) as the input to gb_operation_create.
Would the flexible array address the handling of unspecified lengths
issue (in the fixme comment)?
drivers/staging/greybus/usb.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/drivers/staging/greybus/usb.c b/drivers/staging/greybus/usb.c
index 8e9d9d59a357..d0b2422401df 100644
--- a/drivers/staging/greybus/usb.c
+++ b/drivers/staging/greybus/usb.c
@@ -27,7 +27,8 @@ struct gb_usb_hub_control_request {
};
struct gb_usb_hub_control_response {
- u8 buf[0];
+ __le16 wLength;
+ u8 buf[];
};
struct gb_usb_device {
@@ -102,16 +103,14 @@ static int hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, u16 wIndex,
struct gb_operation *operation;
struct gb_usb_hub_control_request *request;
struct gb_usb_hub_control_response *response;
- size_t response_size;
int ret;
/* FIXME: handle unspecified lengths */
- response_size = sizeof(*response) + wLength;
operation = gb_operation_create(dev->connection,
GB_USB_TYPE_HUB_CONTROL,
sizeof(*request),
- response_size,
+ sizeof(*response),
GFP_KERNEL);
if (!operation)
return -ENOMEM;
--
2.25.1