Skip to content

Commit 09d2407

Browse files
Qi Zhenggregkh
authored andcommitted
mm: shrinker: fix NULL pointer dereference in debugfs
commit e30453c upstream. shrinker_debugfs_add() creates both "count" and "scan" debugfs files unconditionally. That assumes every shrinker implements both count_objects() and scan_objects(), which is not guaranteed. For example, the xen-backend shrinker sets count_objects() but leaves scan_objects() NULL, so writing to its scan file calls through a NULL function pointer and panics the kernel: BUG: kernel NULL pointer dereference, address: 0000000000000000 RIP: 0010:0x0 Code: Unable to access opcode bytes at 0xffffffffffffffd6. Call Trace: <TASK> shrinker_debugfs_scan_write+0x12e/0x270 full_proxy_write+0x5f/0x90 vfs_write+0xde/0x420 ? filp_flush+0x75/0x90 ? filp_close+0x1d/0x30 ? do_dup2+0xb8/0x120 ksys_write+0x68/0xf0 ? filp_flush+0x75/0x90 do_syscall_64+0xb3/0x5b0 entry_SYSCALL_64_after_hwframe+0x76/0x7e The count path has the same issue in principle if a shrinker omits count_objects(). To fix it, only create "count" and "scan" debugfs files when the corresponding callbacks are present. Link: https://lore.kernel.org/20260617090052.27325-1-qi.zheng@linux.dev Fixes: bbf535f ("mm: shrinkers: add scan interface for shrinker debugfs") Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com> Reviewed-by: Muchun Song <muchun.song@linux.dev> Cc: Dave Chinner <david@fromorbit.com> Cc: Qi Zheng <zhengqi.arch@bytedance.com> Cc: Roman Gushchin <roman.gushchin@linux.dev> Cc: <stable@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 729ae27 commit 09d2407

1 file changed

Lines changed: 6 additions & 4 deletions

File tree

mm/shrinker_debug.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -198,10 +198,12 @@ int shrinker_debugfs_add(struct shrinker *shrinker)
198198
}
199199
shrinker->debugfs_entry = entry;
200200

201-
debugfs_create_file("count", 0440, entry, shrinker,
202-
&shrinker_debugfs_count_fops);
203-
debugfs_create_file("scan", 0220, entry, shrinker,
204-
&shrinker_debugfs_scan_fops);
201+
if (shrinker->count_objects)
202+
debugfs_create_file("count", 0440, entry, shrinker,
203+
&shrinker_debugfs_count_fops);
204+
if (shrinker->scan_objects)
205+
debugfs_create_file("scan", 0220, entry, shrinker,
206+
&shrinker_debugfs_scan_fops);
205207
return 0;
206208
}
207209

0 commit comments

Comments
 (0)