提交 b3029c71 编写于 作者: K Kefeng Wang 提交者: Zheng Zengkai

slub: add back check for free nonslab objects

mainline inclusion
from mainline-v5.16-rc1
commit d0fe47c6
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I57LS2
CVE: NA
backport: openEuler-22.03-LTS

--------------------------------

After commit f227f0fa ("slub: fix unreclaimable slab stat for bulk
free"), the check for free nonslab page is replaced by VM_BUG_ON_PAGE,
which only check with CONFIG_DEBUG_VM enabled, but this config may
impact performance, so it only for debug.

Commit 0937502a ("slub: Add check for kfree() of non slab objects.")
add the ability, which should be needed in any configs to catch the
invalid free, they even could be potential issue, eg, memory corruption,
use after free and double free, so replace VM_BUG_ON_PAGE to
WARN_ON_ONCE, add object address printing to help use to debug the
issue.

Link: https://lkml.kernel.org/r/20210930070214.61499-1-wangkefeng.wang@huawei.comSigned-off-by: NKefeng Wang <wangkefeng.wang@huawei.com>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Shakeel Butt <shakeelb@google.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Christoph Lameter <cl@linux.com>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: David Rienjes <rientjes@google.com>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: NMa Wupeng <mawupeng1@huawei.com>
Reviewed-by: NKefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 1a679510
...@@ -3209,7 +3209,9 @@ static inline void free_nonslab_page(struct page *page, void *object) ...@@ -3209,7 +3209,9 @@ static inline void free_nonslab_page(struct page *page, void *object)
{ {
unsigned int order = compound_order(page); unsigned int order = compound_order(page);
VM_BUG_ON_PAGE(!PageCompound(page), page); if (WARN_ON_ONCE(!PageCompound(page)))
pr_warn_once("object pointer: 0x%p\n", object);
kfree_hook(object); kfree_hook(object);
mod_lruvec_page_state(page, NR_SLAB_UNRECLAIMABLE_B, -(PAGE_SIZE << order)); mod_lruvec_page_state(page, NR_SLAB_UNRECLAIMABLE_B, -(PAGE_SIZE << order));
__free_pages(page, order); __free_pages(page, order);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册