diff options
author | Milan Broz <gmazyland@gmail.com> | 2018-11-07 16:24:55 -0500 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2018-12-18 09:02:26 -0500 |
commit | ef87bfc24f9b8da82c89aff493df20f078bc9cb1 (patch) | |
tree | 9f0f98dbf82d895699bcf1036b326df2ac6d464f | |
parent | 8d683dcd65c037efc9fb38c696ec9b65b306e573 (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.c | 2 | ||||
-rw-r--r-- | drivers/md/dm-delay.c | 2 | ||||
-rw-r--r-- | drivers/md/dm-flakey.c | 2 | ||||
-rw-r--r-- | drivers/md/dm-linear.c | 2 | ||||
-rw-r--r-- | drivers/md/dm-raid1.c | 3 | ||||
-rw-r--r-- | drivers/md/dm-unstripe.c | 2 |
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 | } |