Skip to content

Commit 35f6b32

Browse files
avasummergregkh
authored andcommitted
dm mirror: fix integer overflow in create_dirty_log()
commit 4c788c6 upstream. 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: 1da177e ("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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent c5a45d1 commit 35f6b32

1 file changed

Lines changed: 3 additions & 3 deletions

File tree

drivers/md/dm-raid1.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -993,13 +993,13 @@ static struct dm_dirty_log *create_dirty_log(struct dm_target *ti,
993993
return NULL;
994994
}
995995

996-
*args_used = 2 + param_count;
997-
998-
if (argc < *args_used) {
996+
if (param_count > argc - 2) {
999997
ti->error = "Insufficient mirror log arguments";
1000998
return NULL;
1001999
}
10021000

1001+
*args_used = 2 + param_count;
1002+
10031003
dl = dm_dirty_log_create(argv[0], ti, mirror_flush, param_count,
10041004
argv + 2);
10051005
if (!dl) {

0 commit comments

Comments
 (0)