Message ID | 20200525164319.GA13596@embeddedor (mailing list archive) |
---|---|
State | Mainlined, archived |
Commit | d0684fd0bd79395e074dd668feee5d53b134b1a3 |
Delegated to: | Lorenzo Pieralisi |
Headers | show |
Series | PCI: hv: Use struct_size() helper | expand |
On Mon, May 25, 2020 at 11:43:19AM -0500, Gustavo A. R. Silva wrote: > One of the more common cases of allocation size calculations is finding > the size of a structure that has a zero-sized array at the end, along > with memory for some number of elements for that array. For example: > > struct hv_dr_state { > ... > struct hv_pcidev_description func[]; > }; > > struct pci_bus_relations { > ... > struct pci_function_description func[]; > } __packed; > > Make use of the struct_size() helper instead of an open-coded version > in order to avoid any potential type mistakes. > > So, replace the following forms: > > offsetof(struct hv_dr_state, func) + > (sizeof(struct hv_pcidev_description) * > (relations->device_count)) > > offsetof(struct pci_bus_relations, func) + > (sizeof(struct pci_function_description) * > (bus_rel->device_count)) > > with: > > struct_size(dr, func, relations->device_count) > > and > > struct_size(bus_rel, func, bus_rel->device_count) > > respectively. > > Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org> Reviewed-by: Wei Liu <wei.liu@kernel.org> FAOD I expect this patch to go through pci tree.
On Mon, May 25, 2020 at 11:43:19AM -0500, Gustavo A. R. Silva wrote: > One of the more common cases of allocation size calculations is finding > the size of a structure that has a zero-sized array at the end, along > with memory for some number of elements for that array. For example: > > struct hv_dr_state { > ... > struct hv_pcidev_description func[]; > }; > > struct pci_bus_relations { > ... > struct pci_function_description func[]; > } __packed; > > Make use of the struct_size() helper instead of an open-coded version > in order to avoid any potential type mistakes. > > So, replace the following forms: > > offsetof(struct hv_dr_state, func) + > (sizeof(struct hv_pcidev_description) * > (relations->device_count)) > > offsetof(struct pci_bus_relations, func) + > (sizeof(struct pci_function_description) * > (bus_rel->device_count)) > > with: > > struct_size(dr, func, relations->device_count) > > and > > struct_size(bus_rel, func, bus_rel->device_count) > > respectively. > > Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org> > --- > drivers/pci/controller/pci-hyperv.c | 22 ++++++++-------------- > 1 file changed, 8 insertions(+), 14 deletions(-) Applied to pci/hv, thanks. Lorenzo > diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c > index 892f3a742117a..bf40ff09c99d6 100644 > --- a/drivers/pci/controller/pci-hyperv.c > +++ b/drivers/pci/controller/pci-hyperv.c > @@ -2213,10 +2213,8 @@ static void hv_pci_devices_present(struct hv_pcibus_device *hbus, > struct hv_dr_state *dr; > int i; > > - dr = kzalloc(offsetof(struct hv_dr_state, func) + > - (sizeof(struct hv_pcidev_description) * > - (relations->device_count)), GFP_NOWAIT); > - > + dr = kzalloc(struct_size(dr, func, relations->device_count), > + GFP_NOWAIT); > if (!dr) > return; > > @@ -2250,10 +2248,8 @@ static void hv_pci_devices_present2(struct hv_pcibus_device *hbus, > struct hv_dr_state *dr; > int i; > > - dr = kzalloc(offsetof(struct hv_dr_state, func) + > - (sizeof(struct hv_pcidev_description) * > - (relations->device_count)), GFP_NOWAIT); > - > + dr = kzalloc(struct_size(dr, func, relations->device_count), > + GFP_NOWAIT); > if (!dr) > return; > > @@ -2447,9 +2443,8 @@ static void hv_pci_onchannelcallback(void *context) > > bus_rel = (struct pci_bus_relations *)buffer; > if (bytes_recvd < > - offsetof(struct pci_bus_relations, func) + > - (sizeof(struct pci_function_description) * > - (bus_rel->device_count))) { > + struct_size(bus_rel, func, > + bus_rel->device_count)) { > dev_err(&hbus->hdev->device, > "bus relations too small\n"); > break; > @@ -2462,9 +2457,8 @@ static void hv_pci_onchannelcallback(void *context) > > bus_rel2 = (struct pci_bus_relations2 *)buffer; > if (bytes_recvd < > - offsetof(struct pci_bus_relations2, func) + > - (sizeof(struct pci_function_description2) * > - (bus_rel2->device_count))) { > + struct_size(bus_rel2, func, > + bus_rel2->device_count)) { > dev_err(&hbus->hdev->device, > "bus relations v2 too small\n"); > break; > -- > 2.26.2 >
diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c index 892f3a742117a..bf40ff09c99d6 100644 --- a/drivers/pci/controller/pci-hyperv.c +++ b/drivers/pci/controller/pci-hyperv.c @@ -2213,10 +2213,8 @@ static void hv_pci_devices_present(struct hv_pcibus_device *hbus, struct hv_dr_state *dr; int i; - dr = kzalloc(offsetof(struct hv_dr_state, func) + - (sizeof(struct hv_pcidev_description) * - (relations->device_count)), GFP_NOWAIT); - + dr = kzalloc(struct_size(dr, func, relations->device_count), + GFP_NOWAIT); if (!dr) return; @@ -2250,10 +2248,8 @@ static void hv_pci_devices_present2(struct hv_pcibus_device *hbus, struct hv_dr_state *dr; int i; - dr = kzalloc(offsetof(struct hv_dr_state, func) + - (sizeof(struct hv_pcidev_description) * - (relations->device_count)), GFP_NOWAIT); - + dr = kzalloc(struct_size(dr, func, relations->device_count), + GFP_NOWAIT); if (!dr) return; @@ -2447,9 +2443,8 @@ static void hv_pci_onchannelcallback(void *context) bus_rel = (struct pci_bus_relations *)buffer; if (bytes_recvd < - offsetof(struct pci_bus_relations, func) + - (sizeof(struct pci_function_description) * - (bus_rel->device_count))) { + struct_size(bus_rel, func, + bus_rel->device_count)) { dev_err(&hbus->hdev->device, "bus relations too small\n"); break; @@ -2462,9 +2457,8 @@ static void hv_pci_onchannelcallback(void *context) bus_rel2 = (struct pci_bus_relations2 *)buffer; if (bytes_recvd < - offsetof(struct pci_bus_relations2, func) + - (sizeof(struct pci_function_description2) * - (bus_rel2->device_count))) { + struct_size(bus_rel2, func, + bus_rel2->device_count)) { dev_err(&hbus->hdev->device, "bus relations v2 too small\n"); break;
One of the more common cases of allocation size calculations is finding the size of a structure that has a zero-sized array at the end, along with memory for some number of elements for that array. For example: struct hv_dr_state { ... struct hv_pcidev_description func[]; }; struct pci_bus_relations { ... struct pci_function_description func[]; } __packed; Make use of the struct_size() helper instead of an open-coded version in order to avoid any potential type mistakes. So, replace the following forms: offsetof(struct hv_dr_state, func) + (sizeof(struct hv_pcidev_description) * (relations->device_count)) offsetof(struct pci_bus_relations, func) + (sizeof(struct pci_function_description) * (bus_rel->device_count)) with: struct_size(dr, func, relations->device_count) and struct_size(bus_rel, func, bus_rel->device_count) respectively. Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org> --- drivers/pci/controller/pci-hyperv.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-)