summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMilan Broz <gmazyland@gmail.com>2018-11-07 16:24:55 -0500
committerMike Snitzer <snitzer@redhat.com>2018-12-18 09:02:26 -0500
commitef87bfc24f9b8da82c89aff493df20f078bc9cb1 (patch)
tree9f0f98dbf82d895699bcf1036b326df2ac6d464f
parent8d683dcd65c037efc9fb38c696ec9b65b306e573 (diff)
dm: Check for device sector overflow if CONFIG_LBDAF is not set
Reference to a device in device-mapper table contains offset in sectors. If the sector_t is 32bit integer (CONFIG_LBDAF is not set), then several device-mapper targets can overflow this offset and validity check is then performed on a wrong offset and a wrong table is activated. See for example (on 32bit without CONFIG_LBDAF) this overflow: # dmsetup create test --table "0 2048 linear /dev/sdg 4294967297" # dmsetup table test 0 2048 linear 8:96 1 This patch adds explicit check for overflow if the offset is sector_t type. Signed-off-by: Milan Broz <gmazyland@gmail.com> Reviewed-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
-rw-r--r--drivers/md/dm-crypt.c2
-rw-r--r--drivers/md/dm-delay.c2
-rw-r--r--drivers/md/dm-flakey.c2
-rw-r--r--drivers/md/dm-linear.c2
-rw-r--r--drivers/md/dm-raid1.c3
-rw-r--r--drivers/md/dm-unstripe.c2
6 files changed, 7 insertions, 6 deletions
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
index 9a4dec0a0f71..fc7d8b8a654f 100644
--- a/drivers/md/dm-crypt.c
+++ b/drivers/md/dm-crypt.c
@@ -2781,7 +2781,7 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv)
2781 } 2781 }
2782 2782
2783 ret = -EINVAL; 2783 ret = -EINVAL;
2784 if (sscanf(argv[4], "%llu%c", &tmpll, &dummy) != 1) { 2784 if (sscanf(argv[4], "%llu%c", &tmpll, &dummy) != 1 || tmpll != (sector_t)tmpll) {
2785 ti->error = "Invalid device sector"; 2785 ti->error = "Invalid device sector";
2786 goto bad; 2786 goto bad;
2787 } 2787 }
diff --git a/drivers/md/dm-delay.c b/drivers/md/dm-delay.c
index 2fb7bb4304ad..fddffe251bf6 100644
--- a/drivers/md/dm-delay.c
+++ b/drivers/md/dm-delay.c
@@ -141,7 +141,7 @@ static int delay_class_ctr(struct dm_target *ti, struct delay_class *c, char **a
141 unsigned long long tmpll; 141 unsigned long long tmpll;
142 char dummy; 142 char dummy;
143 143
144 if (sscanf(argv[1], "%llu%c", &tmpll, &dummy) != 1) { 144 if (sscanf(argv[1], "%llu%c", &tmpll, &dummy) != 1 || tmpll != (sector_t)tmpll) {
145 ti->error = "Invalid device sector"; 145 ti->error = "Invalid device sector";
146 return -EINVAL; 146 return -EINVAL;
147 } 147 }
diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c
index 3cb97fa4c11d..8261aa8c7fe1 100644
--- a/drivers/md/dm-flakey.c
+++ b/drivers/md/dm-flakey.c
@@ -213,7 +213,7 @@ static int flakey_ctr(struct dm_target *ti, unsigned int argc, char **argv)
213 devname = dm_shift_arg(&as); 213 devname = dm_shift_arg(&as);
214 214
215 r = -EINVAL; 215 r = -EINVAL;
216 if (sscanf(dm_shift_arg(&as), "%llu%c", &tmpll, &dummy) != 1) { 216 if (sscanf(dm_shift_arg(&as), "%llu%c", &tmpll, &dummy) != 1 || tmpll != (sector_t)tmpll) {
217 ti->error = "Invalid device sector"; 217 ti->error = "Invalid device sector";
218 goto bad; 218 goto bad;
219 } 219 }
diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c
index 8d7ddee6ac4d..ad980a38fb1e 100644
--- a/drivers/md/dm-linear.c
+++ b/drivers/md/dm-linear.c
@@ -45,7 +45,7 @@ static int linear_ctr(struct dm_target *ti, unsigned int argc, char **argv)
45 } 45 }
46 46
47 ret = -EINVAL; 47 ret = -EINVAL;
48 if (sscanf(argv[1], "%llu%c", &tmp, &dummy) != 1) { 48 if (sscanf(argv[1], "%llu%c", &tmp, &dummy) != 1 || tmp != (sector_t)tmp) {
49 ti->error = "Invalid device sector"; 49 ti->error = "Invalid device sector";
50 goto bad; 50 goto bad;
51 } 51 }
diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c
index 79eab1071ec2..5a51151f680d 100644
--- a/drivers/md/dm-raid1.c
+++ b/drivers/md/dm-raid1.c
@@ -943,7 +943,8 @@ static int get_mirror(struct mirror_set *ms, struct dm_target *ti,
943 char dummy; 943 char dummy;
944 int ret; 944 int ret;
945 945
946 if (sscanf(argv[1], "%llu%c", &offset, &dummy) != 1) { 946 if (sscanf(argv[1], "%llu%c", &offset, &dummy) != 1 ||
947 offset != (sector_t)offset) {
947 ti->error = "Invalid offset"; 948 ti->error = "Invalid offset";
948 return -EINVAL; 949 return -EINVAL;
949 } 950 }
diff --git a/drivers/md/dm-unstripe.c b/drivers/md/dm-unstripe.c
index 954b7ab4e684..e673dacf6418 100644
--- a/drivers/md/dm-unstripe.c
+++ b/drivers/md/dm-unstripe.c
@@ -78,7 +78,7 @@ static int unstripe_ctr(struct dm_target *ti, unsigned int argc, char **argv)
78 goto err; 78 goto err;
79 } 79 }
80 80
81 if (sscanf(argv[4], "%llu%c", &start, &dummy) != 1) { 81 if (sscanf(argv[4], "%llu%c", &start, &dummy) != 1 || start != (sector_t)start) {
82 ti->error = "Invalid striped device offset"; 82 ti->error = "Invalid striped device offset";
83 goto err; 83 goto err;
84 } 84 }