dm: limit the number of targets and parameter size area
[linux-2.6-microblaze.git] / drivers / md / dm-table.c
index 260b5b8..41f1d73 100644 (file)
@@ -129,7 +129,12 @@ static int alloc_targets(struct dm_table *t, unsigned int num)
 int dm_table_create(struct dm_table **result, blk_mode_t mode,
                    unsigned int 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;
@@ -144,7 +149,7 @@ int dm_table_create(struct dm_table **result, blk_mode_t mode,
 
        if (!num_targets) {
                kfree(t);
-               return -ENOMEM;
+               return -EOVERFLOW;
        }
 
        if (alloc_targets(t, num_targets)) {