zram: fix null dereference of handle
Subsystems (2)
Minchan Kim
maintainerPATCH v2 1/1 zram: fix null dereference of handle
For the testing, I found handle passed to zs_map_object in __zram_bvec_read is NULL so that kernel goes the Oops by pin_object.
The reason is there is no routine to check the slot's freeing after getting the slot's lock. This patch fixes it.
* From v1:
* remove unlikely branch - Sergey
* In !handle case, use 0 instead of zram_get_element - Sergey
Fixes 1f7319c74275 ("zram: partial IO refactoring")
Cc Sergey Senozhatsky <[email protected]>
Signed-off-by Minchan Kim <[email protected]>
--- drivers/block/zram/zram_drv.c | 36 ++++++++++++------------------------ 1 file changed, 12 insertions(+), 24 deletions(-)
drivers/block/zram/zram_drv.c +12 -24
@@ -766,27 +766,6 @@ static void zram_slot_unlock(struct zram *zram, u32 index)bit_spin_unlock (ZRAM_ACCESS , &zram->table[index].value); } -static bool zram_same_page_read (struct zram *zram,u32 index, -struct page *page, -unsigned int offset,unsigned int len) -{ -zram_slot_lock (zram, index); -if (unlikely (!zram_get_handle (zram, index) || -zram_test_flag (zram, index,ZRAM_SAME ))) { -void *mem; - -zram_slot_unlock (zram, index); - mem =kmap_atomic (page); -zram_fill_page (mem + offset, len, -zram_get_element (zram, index)); -kunmap_atomic (mem); -return true; - } -zram_slot_unlock (zram, index); - -return false; -} -static void zram_meta_free (struct zram *zram,u64 disksize) {size_t num_pages = disksize >>PAGE_SHIFT ;
@@ -884,11 +863,20 @@ static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index,zram_slot_unlock (zram, index); } -if (zram_same_page_read (zram, index, page,0 ,PAGE_SIZE )) -return 0 ; -zram_slot_lock (zram, index); handle =zram_get_handle (zram, index); +if (!handle ||zram_test_flag (zram, index,ZRAM_SAME )) { +unsigned long value; +void *mem; + + value = handle ?zram_get_element (zram, index) :0 ; + mem =kmap_atomic (page); +zram_fill_page (mem,PAGE_SIZE , value); +kunmap_atomic (mem); +zram_slot_unlock (zram, index); +return 0 ; + } + size =zram_get_obj_size (zram, index); src =zs_map_object (zram->mem_pool, handle,ZS_MM_RO );
Signature · 1 line
2.7.4
Quoted 6 lines · Minchan Kim
For the testing, I found handle passed to
zs_map_objectin__zram_bvec_readis NULL so that kernel goes the Oops bypin_object.The reason is there is no routine to check the slot's freeing after getting the slot's lock. This patch fixes it.
Quoted 7 lines
* From v1:
* remove unlikely branch - Sergey
* In !handle case, use 0 instead ofzram_get_element- SergeyFixes 1f7319c74275 ("zram: partial IO refactoring")Cc Sergey Senozhatsky <[email protected]>Signed-off-by Minchan Kim <[email protected]>
Reviewed-by Sergey Senozhatsky <[email protected]>
-ss