浏览代码

dm table: fail dm_table_create on dm_round_up overflow

The dm_round_up function may overflow to zero.  In this case,
dm_table_create() must fail rather than go on to allocate an empty array
with alloc_targets().

This fixes a possible memory corruption that could be caused by passing
too large a number in "param->target_count".

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Cc: stable@vger.kernel.org
Mikulas Patocka 11 年之前
父节点
当前提交
5b2d06576c
共有 1 个文件被更改,包括 5 次插入0 次删除
  1. 5 0
      drivers/md/dm-table.c

+ 5 - 0
drivers/md/dm-table.c

@@ -200,6 +200,11 @@ int dm_table_create(struct dm_table **result, fmode_t mode,
 
 
 	num_targets = dm_round_up(num_targets, KEYS_PER_NODE);
 	num_targets = dm_round_up(num_targets, KEYS_PER_NODE);
 
 
+	if (!num_targets) {
+		kfree(t);
+		return -ENOMEM;
+	}
+
 	if (alloc_targets(t, num_targets)) {
 	if (alloc_targets(t, num_targets)) {
 		kfree(t);
 		kfree(t);
 		return -ENOMEM;
 		return -ENOMEM;