Backport the fix for CVE-2024-23851 to v5.10
PATCH 1/1 Backport the fix for CVE-2024-23851 to v5.10
This is the fix of CVE-2024-23851 for kernel v5.10.
Upstream commit: https://github.com/torvalds/linux/commit/bd504bcfec41a503b32054da5472904b404341a4
Changed code not affected by the patch for the old version.
He Gao (1):
dm: limit the number of targets and parameter size area
drivers/md/dm-core.h | 2 ++ drivers/md/dm-ioctl.c | 3 ++- drivers/md/dm-table.c | 9 +++++++-- 3 files changed, 11 insertions(+), 3 deletions(-)
Signature · 1 line
2.44.0.rc0.258.g7320e95886-goog
PATCH 1/1 dm: limit the number of targets and parameter size area
[ Upstream commit bd504bcfec41a503b32054da5472904b404341a4 ]
The kvmalloc function fails with a warning if the size is larger than INT_MAX. The warning was triggered by a syscall testing robot.
In order to avoid the warning, this commit limits the number of targets to 1048576 and the size of the parameter area to 1073741824.
Signed-off-by Mikulas Patocka <[email protected]>
Signed-off-by Mike Snitzer <[email protected]>
Signed-off-by He Gao <[email protected]>
--- drivers/md/dm-core.h | 2 ++ drivers/md/dm-ioctl.c | 3 ++- drivers/md/dm-table.c | 9 +++++++-- 3 files changed, 11 insertions(+), 3 deletions(-)
drivers/md/dm-core.h +2 -0
@@ -19,6 +19,8 @@#include "dm.h" #define DM_RESERVED_MAX_IOS 1024 +#define DM_MAX_TARGETS 1048576 +#define DM_MAX_TARGET_PARAMS 1024struct dm_kobject_holder {struct kobject kobj;
drivers/md/dm-ioctl.c +2 -1
@@ -1760,7 +1760,8 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kernif (copy_from_user (param_kernel, user, minimum_data_size))return -EFAULT ; -if (param_kernel->data_size < minimum_data_size) +if (unlikely (param_kernel->data_size < minimum_data_size) || +unlikely (param_kernel->data_size >DM_MAX_TARGETS *DM_MAX_TARGET_PARAMS ))return -EINVAL ; secure_data = param_kernel->flags &DM_SECURE_DATA_FLAG ;
drivers/md/dm-table.c +7 -2
@@ -144,7 +144,12 @@ static int alloc_targets(struct dm_table *t, unsigned int num)int dm_table_create (struct dm_table **result,fmode_t mode,unsigned num_targets,struct mapped_device *md) { -struct dm_table *t =kzalloc (sizeof (*t),GFP_KERNEL ); +struct dm_table *t; + +if (num_targets >DM_MAX_TARGETS ) +return -EOVERFLOW ; + + t =kzalloc (sizeof (*t),GFP_KERNEL );if (!t)return -ENOMEM ;
@@ -158,7 +163,7 @@ int dm_table_create(struct dm_table **result, fmode_t mode,if (!num_targets) {kfree (t); -return -ENOMEM ; +return -EOVERFLOW ; }if (alloc_targets (t, num_targets)) {
Signature · 1 line
2.44.0.rc0.258.g7320e95886-goog