Commit f3ec6e7a authored by Jiang Liu's avatar Jiang Liu Committed by Greg Kroah-Hartman

zram: avoid access beyond the zram device

commit 12a7ad3b upstream.

Function valid_io_request() should verify the entire request are within
the zram device address range. Otherwise it may cause invalid memory
access when accessing/modifying zram->meta->table[index] because the
'index' is out of range. Then it may access non-exist memory, randomly
modify memory belong to other subsystems, which is hard to track down.
Signed-off-by: default avatarJiang Liu <jiang.liu@huawei.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
Cc: Jianguo Wu <wujianguo@huawei.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 11fc2ee5
...@@ -535,13 +535,20 @@ static void __zram_make_request(struct zram *zram, struct bio *bio, int rw) ...@@ -535,13 +535,20 @@ static void __zram_make_request(struct zram *zram, struct bio *bio, int rw)
*/ */
static inline int valid_io_request(struct zram *zram, struct bio *bio) static inline int valid_io_request(struct zram *zram, struct bio *bio)
{ {
if (unlikely( u64 start, end, bound;
(bio->bi_sector >= (zram->disksize >> SECTOR_SHIFT)) ||
(bio->bi_sector & (ZRAM_SECTOR_PER_LOGICAL_BLOCK - 1)) ||
(bio->bi_size & (ZRAM_LOGICAL_BLOCK_SIZE - 1)))) {
/* unaligned request */
if (unlikely(bio->bi_sector & (ZRAM_SECTOR_PER_LOGICAL_BLOCK - 1)))
return 0;
if (unlikely(bio->bi_size & (ZRAM_LOGICAL_BLOCK_SIZE - 1)))
return 0;
start = bio->bi_sector;
end = start + (bio->bi_size >> SECTOR_SHIFT);
bound = zram->disksize >> SECTOR_SHIFT;
/* out of range range */
if (unlikely(start >= bound || end >= bound || start > end))
return 0; return 0;
}
/* I/O request is valid */ /* I/O request is valid */
return 1; return 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment