svn commit: r365048 - head/sys/cddl/dev/dtrace/amd64
Mark Johnston
markj at FreeBSD.org
Tue Sep 1 15:15:45 UTC 2020
Author: markj
Date: Tue Sep 1 15:15:44 2020
New Revision: 365048
URL: https://svnweb.freebsd.org/changeset/base/365048
Log:
Tighten frame pointer checking in DTrace's amd64 stack unwinder.
Avoid assuming that the kernel was compiled with
-fno-omit-frame-pointer.
MFC after: 1 week
Sponsored by: NetApp, Inc.
Sponsored by: Klara, Inc.
Modified:
head/sys/cddl/dev/dtrace/amd64/dtrace_isa.c
Modified: head/sys/cddl/dev/dtrace/amd64/dtrace_isa.c
==============================================================================
--- head/sys/cddl/dev/dtrace/amd64/dtrace_isa.c Tue Sep 1 15:15:22 2020 (r365047)
+++ head/sys/cddl/dev/dtrace/amd64/dtrace_isa.c Tue Sep 1 15:15:44 2020 (r365048)
@@ -56,6 +56,7 @@ void
dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, int aframes,
uint32_t *intrpc)
{
+ struct thread *td;
int depth = 0;
register_t rbp;
struct amd64_frame *frame;
@@ -70,10 +71,16 @@ dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, in
__asm __volatile("movq %%rbp,%0" : "=r" (rbp));
frame = (struct amd64_frame *)rbp;
+ td = curthread;
while (depth < pcstack_limit) {
if (!INKERNEL((long) frame))
break;
+ if ((vm_offset_t)frame >=
+ td->td_kstack + ptoa(td->td_kstack_pages) ||
+ (vm_offset_t)frame < td->td_kstack)
+ break;
+
callpc = frame->f_retaddr;
if (!INKERNEL(callpc))
@@ -84,14 +91,11 @@ dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, in
if ((aframes == 0) && (caller != 0)) {
pcstack[depth++] = caller;
}
- }
- else {
+ } else {
pcstack[depth++] = callpc;
}
- if (frame->f_frame <= frame ||
- (vm_offset_t)frame->f_frame >= curthread->td_kstack +
- curthread->td_kstack_pages * PAGE_SIZE)
+ if ((vm_offset_t)frame->f_frame <= (vm_offset_t)frame)
break;
frame = frame->f_frame;
}
More information about the svn-src-all
mailing list