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@gmail.com ---
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;