diff --git a/Kernel/Thread.cpp b/Kernel/Thread.cpp index 9fb87b9cba..31e15d17b9 100644 --- a/Kernel/Thread.cpp +++ b/Kernel/Thread.cpp @@ -706,7 +706,6 @@ String Thread::backtrace_impl() const start_frame = frame_ptr(); } - SmapDisabler disabler; auto& process = const_cast(this->process()); ProcessPagingScope paging_scope(process); struct RecognizedSymbol { @@ -717,11 +716,14 @@ String Thread::backtrace_impl() const Vector recognized_symbols; if (current != this) recognized_symbols.append({ tss().eip, ksymbolicate(tss().eip) }); - for (u32* stack_ptr = (u32*)start_frame; process.validate_read_from_kernel(VirtualAddress((u32)stack_ptr), sizeof(void*) * 2); stack_ptr = (u32*)*stack_ptr) { - u32 retaddr = stack_ptr[1]; - recognized_symbols.append({ retaddr, ksymbolicate(retaddr) }); - if (recognized_symbols.size() == 256) + u32 stack_ptr = start_frame; + for (;;) { + if (!process.validate_read_from_kernel(VirtualAddress((u32)stack_ptr), sizeof(void*) * 2)) break; + u32 retaddr; + copy_from_user(&retaddr, &((u32*)stack_ptr)[1]); + recognized_symbols.append({ retaddr, ksymbolicate(retaddr) }); + copy_from_user(&stack_ptr, (u32*)stack_ptr); } bool mask_kernel_addresses = !current->process().is_superuser();