dm: fix a race condition in retrieve_deps
authorMikulas Patocka <mpatocka@redhat.com>
Wed, 9 Aug 2023 10:44:20 +0000 (12:44 +0200)
committerMike Snitzer <snitzer@kernel.org>
Thu, 14 Sep 2023 15:18:29 +0000 (11:18 -0400)
commitf6007dce0cd35d634d9be91ef3515a6385dcee16
tree663ba934a3a55514c73ef0e397c994ac3e4a3358
parent0bb80ecc33a8fb5a682236443c1e740d5c917d1d
dm: fix a race condition in retrieve_deps

There's a race condition in the multipath target when retrieve_deps
races with multipath_message calling dm_get_device and dm_put_device.
retrieve_deps walks the list of open devices without holding any lock
but multipath may add or remove devices to the list while it is
running. The end result may be memory corruption or use-after-free
memory access.

See this description of a UAF with multipath_message():
https://listman.redhat.com/archives/dm-devel/2022-October/052373.html

Fix this bug by introducing a new rw semaphore "devices_lock". We grab
devices_lock for read in retrieve_deps and we grab it for write in
dm_get_device and dm_put_device.

Reported-by: Luo Meng <luomeng12@huawei.com>
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Cc: stable@vger.kernel.org
Tested-by: Li Lingfeng <lilingfeng3@huawei.com>
Signed-off-by: Mike Snitzer <snitzer@kernel.org>
drivers/md/dm-core.h
drivers/md/dm-ioctl.c
drivers/md/dm-table.c