Merge tag 'overflow-v4.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux
Pull overflow updates from Kees Cook: "This adds the new overflow checking helpers and adds them to the 2-factor argument allocators. And this adds the saturating size helpers and does a treewide replacement for the struct_size() usage. Additionally this adds the overflow testing modules to make sure everything works. I'm still working on the treewide replacements for allocators with "simple" multiplied arguments: *alloc(a * b, ...) -> *alloc_array(a, b, ...) and *zalloc(a * b, ...) -> *calloc(a, b, ...) as well as the more complex cases, but that's separable from this portion of the series. I expect to have the rest sent before -rc1 closes; there are a lot of messy cases to clean up. Summary: - Introduce arithmetic overflow test helper functions (Rasmus) - Use overflow helpers in 2-factor allocators (Kees, Rasmus) - Introduce overflow test module (Rasmus, Kees) - Introduce saturating size helper functions (Matthew, Kees) - Treewide use of struct_size() for allocators (Kees)" * tag 'overflow-v4.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux: treewide: Use struct_size() for devm_kmalloc() and friends treewide: Use struct_size() for vmalloc()-family treewide: Use struct_size() for kmalloc()-family device: Use overflow helpers for devm_kmalloc() mm: Use overflow helpers in kvmalloc() mm: Use overflow helpers in kmalloc_array*() test_overflow: Add memory allocation overflow tests overflow.h: Add allocation size calculation helpers test_overflow: Report test failures test_overflow: macrofy some more, do more tests for free lib: add runtime test of check_*_overflow functions compiler.h: enable builtin overflow checkers and add fallback code
Этот коммит содержится в:
@@ -1157,8 +1157,9 @@ static void ib_cache_update(struct ib_device *device,
|
||||
goto err;
|
||||
}
|
||||
|
||||
pkey_cache = kmalloc(sizeof *pkey_cache + tprops->pkey_tbl_len *
|
||||
sizeof *pkey_cache->table, GFP_KERNEL);
|
||||
pkey_cache = kmalloc(struct_size(pkey_cache, table,
|
||||
tprops->pkey_tbl_len),
|
||||
GFP_KERNEL);
|
||||
if (!pkey_cache)
|
||||
goto err;
|
||||
|
||||
|
@@ -4298,8 +4298,8 @@ static void cm_add_one(struct ib_device *ib_device)
|
||||
int count = 0;
|
||||
u8 i;
|
||||
|
||||
cm_dev = kzalloc(sizeof(*cm_dev) + sizeof(*port) *
|
||||
ib_device->phys_port_cnt, GFP_KERNEL);
|
||||
cm_dev = kzalloc(struct_size(cm_dev, port, ib_device->phys_port_cnt),
|
||||
GFP_KERNEL);
|
||||
if (!cm_dev)
|
||||
return;
|
||||
|
||||
|
@@ -813,7 +813,7 @@ static void mcast_add_one(struct ib_device *device)
|
||||
int i;
|
||||
int count = 0;
|
||||
|
||||
dev = kmalloc(sizeof *dev + device->phys_port_cnt * sizeof *port,
|
||||
dev = kmalloc(struct_size(dev, port, device->phys_port_cnt),
|
||||
GFP_KERNEL);
|
||||
if (!dev)
|
||||
return;
|
||||
|
@@ -2756,8 +2756,8 @@ static struct ib_uflow_resources *flow_resources_alloc(size_t num_specs)
|
||||
struct ib_uflow_resources *resources;
|
||||
|
||||
resources =
|
||||
kmalloc(sizeof(*resources) +
|
||||
num_specs * sizeof(*resources->collection), GFP_KERNEL);
|
||||
kmalloc(struct_size(resources, collection, num_specs),
|
||||
GFP_KERNEL);
|
||||
|
||||
if (!resources)
|
||||
return NULL;
|
||||
|
@@ -297,8 +297,7 @@ static struct uverbs_method_spec *build_method_with_attrs(const struct uverbs_me
|
||||
if (max_attr_buckets >= 0)
|
||||
num_attr_buckets = max_attr_buckets + 1;
|
||||
|
||||
method = kzalloc(sizeof(*method) +
|
||||
num_attr_buckets * sizeof(*method->attr_buckets),
|
||||
method = kzalloc(struct_size(method, attr_buckets, num_attr_buckets),
|
||||
GFP_KERNEL);
|
||||
if (!method)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
@@ -446,9 +445,9 @@ static struct uverbs_object_spec *build_object_with_methods(const struct uverbs_
|
||||
if (max_method_buckets >= 0)
|
||||
num_method_buckets = max_method_buckets + 1;
|
||||
|
||||
object = kzalloc(sizeof(*object) +
|
||||
num_method_buckets *
|
||||
sizeof(*object->method_buckets), GFP_KERNEL);
|
||||
object = kzalloc(struct_size(object, method_buckets,
|
||||
num_method_buckets),
|
||||
GFP_KERNEL);
|
||||
if (!object)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
@@ -469,8 +468,8 @@ static struct uverbs_object_spec *build_object_with_methods(const struct uverbs_
|
||||
if (methods_max_bucket < 0)
|
||||
continue;
|
||||
|
||||
hash = kzalloc(sizeof(*hash) +
|
||||
sizeof(*hash->methods) * (methods_max_bucket + 1),
|
||||
hash = kzalloc(struct_size(hash, methods,
|
||||
methods_max_bucket + 1),
|
||||
GFP_KERNEL);
|
||||
if (!hash) {
|
||||
res = -ENOMEM;
|
||||
@@ -579,8 +578,8 @@ struct uverbs_root_spec *uverbs_alloc_spec_tree(unsigned int num_trees,
|
||||
if (max_object_buckets >= 0)
|
||||
num_objects_buckets = max_object_buckets + 1;
|
||||
|
||||
root_spec = kzalloc(sizeof(*root_spec) +
|
||||
num_objects_buckets * sizeof(*root_spec->object_buckets),
|
||||
root_spec = kzalloc(struct_size(root_spec, object_buckets,
|
||||
num_objects_buckets),
|
||||
GFP_KERNEL);
|
||||
if (!root_spec)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
@@ -603,8 +602,8 @@ struct uverbs_root_spec *uverbs_alloc_spec_tree(unsigned int num_trees,
|
||||
if (objects_max_bucket < 0)
|
||||
continue;
|
||||
|
||||
hash = kzalloc(sizeof(*hash) +
|
||||
sizeof(*hash->objects) * (objects_max_bucket + 1),
|
||||
hash = kzalloc(struct_size(hash, objects,
|
||||
objects_max_bucket + 1),
|
||||
GFP_KERNEL);
|
||||
if (!hash) {
|
||||
res = -ENOMEM;
|
||||
|
Ссылка в новой задаче
Block a user