PCI: hv: Use struct_size() helper
Subsystems (4)
PATCH 1/1 PCI: hv: Use struct_size() helper
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.
--- drivers/pci/controller/pci-hyperv.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-)
drivers/pci/controller/pci-hyperv.c +8 -14
@@ -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 ;
Signature · 1 line
2.26.2
Quoted 31 lines · Gustavo A. R. Silva
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)
Quoted 7 lines
and
struct_size(bus_rel, func, bus_rel->device_count)respectively.
Signed-off-by Gustavo A. R. Silva <[email protected]>
FAOD I expect this patch to go through pci tree.
Lorenzo Pieralisi
AppliedQuoted 33 lines · Gustavo A. R. Silva
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
Quoted 8 lines
struct_size(bus_rel, func, bus_rel->device_count)respectively.
Signed-off-by Gustavo A. R. Silva <[email protected]>--- drivers/pci/controller/pci-hyperv.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-)
Applied to pci/hv, thanks.
Lorenzo
Quoted 57 lines
drivers/pci/controller/pci-hyperv.c +8
-14@@ -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 ;Signature · 1 line
2.26.2