dm mirror: fix integer overflow in create_dirty_log()
The argument count calculation in create_dirty_log() performs
`*args_used = 2 + param_count` before validating against argc. When a
user provides a param_count close to UINT_MAX via the device mapper
table string, this unsigned addition wraps around to a small value,
causing the subsequent `argc < *args_used` check to be bypassed.
The overflowed param_count is then passed as argc to dm_dirty_log_create(),
where it can cause out-of-bounds reads on the argv array.
Fix by comparing param_count against argc - 2 before performing the
addition, following the same pattern used by parse_features() in the
same file. Since argc >= 2 is already guaranteed, the subtraction is
safe.
Fixes: 1da177e4c3 ("Linux-2.6.12-rc2")
Cc: stable@vger.kernel.org
Reported-by: Yuhao Jiang <danisjiang@gmail.com>
Signed-off-by: Junrui Luo <moonafterrain@outlook.com>
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
master
parent
db139186be
commit
4c788c6f92
|
|
@ -993,13 +993,13 @@ static struct dm_dirty_log *create_dirty_log(struct dm_target *ti,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
*args_used = 2 + param_count;
|
if (param_count > argc - 2) {
|
||||||
|
|
||||||
if (argc < *args_used) {
|
|
||||||
ti->error = "Insufficient mirror log arguments";
|
ti->error = "Insufficient mirror log arguments";
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*args_used = 2 + param_count;
|
||||||
|
|
||||||
dl = dm_dirty_log_create(argv[0], ti, mirror_flush, param_count,
|
dl = dm_dirty_log_create(argv[0], ti, mirror_flush, param_count,
|
||||||
argv + 2);
|
argv + 2);
|
||||||
if (!dl) {
|
if (!dl) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue