kvm: Use struct_size() in kmalloc()
PATCH 1/1 kvm: Use struct_size() in kmalloc()
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 foo {
int stuff;
void *entry[];
};instance = kmalloc(sizeof(struct foo) + sizeof(void *) * count, GFP_KERNEL);
Instead of leaving these open-coded and prone to type mistakes, we can now use the new struct_size() helper:
instance = kmalloc(struct_size(instance, entry, count), GFP_KERNEL);
This code was detected with the help of Coccinelle.
--- virt/kvm/kvm_main.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
virt/kvm/kvm_main.c +4 -4
@@ -3709,8 +3709,8 @@ int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr,if (bus->dev_count - bus->ioeventfd_count >NR_IOBUS_DEVS -1 )return -ENOSPC ; - new_bus =kmalloc (sizeof (*bus) + ((bus->dev_count +1 ) * -sizeof (struct kvm_io_range )),GFP_KERNEL ); + new_bus =kmalloc (struct_size (bus, range, bus->dev_count +1 ), +GFP_KERNEL );if (!new_bus)return -ENOMEM ;
@@ -3755,8 +3755,8 @@ void kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx,if (i == bus->dev_count)return ; - new_bus =kmalloc (sizeof (*bus) + ((bus->dev_count -1 ) * -sizeof (struct kvm_io_range )),GFP_KERNEL ); + new_bus =kmalloc (struct_size (bus, range, bus->dev_count -1 ), +GFP_KERNEL );if (!new_bus) {pr_err ("kvm: failed to shrink bus, removing it completely\n" ); goto broken;
Signature · 1 line
2.20.1
Radim Krčmář
Applied2019-01-04 10:29-0600, Gustavo A. R. Silva:
Quoted 14 lines
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 foo { int stuff; void *entry[]; };instance =
kmalloc(sizeof(struct foo) + sizeof(void *) * count, GFP_KERNEL);Instead of leaving these open-coded and prone to type mistakes, we can now use the new
struct_size()helper:
Quoted 6 lines
instance =
kmalloc(struct_size(instance, entry, count), GFP_KERNEL);This code was detected with the help of Coccinelle.
Signed-off-by Gustavo A. R. Silva <[email protected]>---
Queued, thanks.
Hi all,
Friendly ping:
Who can take this?
Thanks
--
Gustavo
Quoted 50 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 foo { int stuff; void *entry[]; };instance =
kmalloc(sizeof(struct foo) + sizeof(void *) * count, GFP_KERNEL);Instead of leaving these open-coded and prone to type mistakes, we can now use the new
struct_size()helper:instance =
kmalloc(struct_size(instance, entry, count), GFP_KERNEL);This code was detected with the help of Coccinelle.
Signed-off-by Gustavo A. R. Silva <[email protected]>--- virt/kvm/kvm_main.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)virt/kvm/kvm_main.c +4
-4@@ -3709,8 +3709,8 @@ int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr,if (bus->dev_count - bus->ioeventfd_count >NR_IOBUS_DEVS -1 )return -ENOSPC ; - new_bus =kmalloc (sizeof (*bus) + ((bus->dev_count +1 ) * -sizeof (struct kvm_io_range )),GFP_KERNEL ); + new_bus =kmalloc (struct_size (bus, range, bus->dev_count +1 ), +GFP_KERNEL );if (!new_bus)return -ENOMEM ;@@ -3755,8 +3755,8 @@ void kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx,if (i == bus->dev_count)return ; - new_bus =kmalloc (sizeof (*bus) + ((bus->dev_count -1 ) * -sizeof (struct kvm_io_range )),GFP_KERNEL ); + new_bus =kmalloc (struct_size (bus, range, bus->dev_count -1 ), +GFP_KERNEL );if (!new_bus) {pr_err ("kvm: failed to shrink bus, removing it completely\n" ); goto broken;
Paolo Bonzini
maintainerQuoted 5 lines · Gustavo A. R. Silva
Hi all,
Friendly ping:
Who can take this?
I cannot find the original message in my inbox, but I've queued it from the quote below.
Thanks,
Paolo
Quoted 55 lines
Thanks
--
GustavoQuoted 50 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 foo { int stuff; void *entry[]; };instance =
kmalloc(sizeof(struct foo) + sizeof(void *) * count, GFP_KERNEL);Instead of leaving these open-coded and prone to type mistakes, we can now use the new
struct_size()helper:instance =
kmalloc(struct_size(instance, entry, count), GFP_KERNEL);This code was detected with the help of Coccinelle.
Signed-off-by Gustavo A. R. Silva <[email protected]>--- virt/kvm/kvm_main.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)virt/kvm/kvm_main.c +4
-4@@ -3709,8 +3709,8 @@ int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr,if (bus->dev_count - bus->ioeventfd_count >NR_IOBUS_DEVS -1 )return -ENOSPC ; - new_bus =kmalloc (sizeof (*bus) + ((bus->dev_count +1 ) * -sizeof (struct kvm_io_range )),GFP_KERNEL ); + new_bus =kmalloc (struct_size (bus, range, bus->dev_count +1 ), +GFP_KERNEL );if (!new_bus)return -ENOMEM ;@@ -3755,8 +3755,8 @@ void kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx,if (i == bus->dev_count)return ; - new_bus =kmalloc (sizeof (*bus) + ((bus->dev_count -1 ) * -sizeof (struct kvm_io_range )),GFP_KERNEL ); + new_bus =kmalloc (struct_size (bus, range, bus->dev_count -1 ), +GFP_KERNEL );if (!new_bus) {pr_err ("kvm: failed to shrink bus, removing it completely\n" ); goto broken;
Quoted 10 lines · Paolo Bonzini
Quoted 5 lines · Gustavo A. R. Silva
Hi all,
Friendly ping:
Who can take this?
I cannot find the original message in my inbox, but I've queued it from the quote below.
Thank you, Paolo.
--
Gustavo