FAILED: patch "[PATCH] zram: fix null dereference of handle" failed to apply to 4.13-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.13-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
ae94264ed4b0cf7cd887947650db4c69acb62072Mon Sep 17 00:00:00 2001
From: Minchan Kim <[email protected]>
Date: Tue, 3 Oct 2017 16:15:19 -0700
Subject: [PATCH] zram: fix null dereference of handle
In testing I found handle passed to zs_map_object in __zram_bvec_read is NULL so eh kernel goes oops in 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.
[[email protected]: v2]
Fixes 1f7319c74275 ("zram: partial IO refactoring")
Signed-off-by Minchan Kim <[email protected]>
Reviewed-by Sergey Senozhatsky <[email protected]>
Cc <[email protected]>
Signed-off-by Andrew Morton <[email protected]>
Signed-off-by Linus Torvalds <[email protected]>
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 );