BUG: KASAN: vmalloc-out-of-bounds in copy_to_kernel_nofault+0xd8/0x1c8 (v6.13-rc6, PowerMac G4)

Christophe Leroy christophe.leroy at csgroup.eu
Sun Feb 2 19:44:20 AEDT 2025



Le 01/02/2025 à 16:54, Erhard Furtner a écrit :
> On Sat, 1 Feb 2025 16:14:04 +0100
> Christophe Leroy <christophe.leroy at csgroup.eu> wrote:
> 
>> Thanks for the report.
>>
>> That's something different. Previous report was:
>>
>> BUG: KASAN: vmalloc-out-of-bounds in copy_to_kernel_nofault+0xd8/0x1c8
>>
>> This is what my patch fixes.
>>
>> New report is:
>>
>> BUG: KASAN: user-memory-access in copy_to_kernel_nofault+0x8c/0x1a0
>>
>> Christophe
> 
> Ah, sorry... I have not been very thoroughly it seems!
> 
> The dmesg looked similarly so I thought it was the same issue.
> 

This time the problem is a mixture of commit 465cabc97b42 
("powerpc/code-patching: introduce patch_instructions()") and commit 
c28c15b6d28a ("powerpc/code-patching: Use temporary mm for Radix MMU") 
which is revealed by commit e4137f08816b ("mm, kasan, kmsan: instrument 
copy_from/to_kernel_nofault")

Commit c28c15b6d28a is inspired by commit b3fd8e83ada0 
("x86/alternatives: Use temporary mm for text poking") but misses the 
kasan_disable_current() / kasan_enable_current() sequence.

Was not necessary because __patch_mem() is not instrumented. But commit 
465cabc97b42 added use of copy_to_kernel_nofault() which is now 
instrumented.

The problem is that commit c28c15b6d28a makes use of a special memory 
area which is not kernel memory and it doesn't have any matching KASAN 
shadow area. And because it is located below TASK_SIZE, in addition 
kasan sees it as user memory.

Can you try the change below ?

diff --git a/arch/powerpc/lib/code-patching.c 
b/arch/powerpc/lib/code-patching.c
index 8a378fc19074..f84e0337cc02 100644
--- a/arch/powerpc/lib/code-patching.c
+++ b/arch/powerpc/lib/code-patching.c
@@ -493,7 +493,9 @@ static int __do_patch_instructions_mm(u32 *addr, u32 
*code, size_t len, bool rep

  	orig_mm = start_using_temp_mm(patching_mm);

+	kasan_disable_current();
  	err = __patch_instructions(patch_addr, code, len, repeat_instr);
+	kasan_enable_current();

  	/* context synchronisation performed by __patch_instructions */
  	stop_using_temp_mm(patching_mm, orig_mm);



More information about the Linuxppc-dev mailing list