Add additional checks of the kernel stack addresses in order to
ensure we don't overrun the end of the call chain. MFC after: 1 week
This commit is contained in:
parent
933ef0ba72
commit
259100de20
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=200272
@ -36,15 +36,20 @@ __FBSDID("$FreeBSD$");
|
||||
#include <machine/stack.h>
|
||||
#include <machine/vmparam.h>
|
||||
|
||||
static void stack_capture(struct stack *st, struct frame *fp);
|
||||
static void stack_capture(struct stack *st, struct frame *frame);
|
||||
|
||||
static void
|
||||
stack_capture(struct stack *st, struct frame *fp)
|
||||
stack_capture(struct stack *st, struct frame *frame)
|
||||
{
|
||||
struct frame *fp;
|
||||
vm_offset_t callpc;
|
||||
|
||||
stack_zero(st);
|
||||
while (1) {
|
||||
fp = frame;
|
||||
for (;;) {
|
||||
if (!INKERNEL((vm_offset_t)fp) ||
|
||||
!ALIGNED_POINTER(fp, uint64_t))
|
||||
break;
|
||||
callpc = fp->fr_pc;
|
||||
if (!INKERNEL(callpc))
|
||||
break;
|
||||
@ -56,6 +61,9 @@ stack_capture(struct stack *st, struct frame *fp)
|
||||
break;
|
||||
if (stack_put(st, callpc) == -1)
|
||||
break;
|
||||
if (v9next_frame(fp) <= fp ||
|
||||
v9next_frame(fp) >= frame + KSTACK_PAGES * PAGE_SIZE)
|
||||
break;
|
||||
fp = v9next_frame(fp);
|
||||
}
|
||||
}
|
||||
|
@ -36,20 +36,28 @@ __FBSDID("$FreeBSD$");
|
||||
#include <machine/stack.h>
|
||||
#include <machine/vmparam.h>
|
||||
|
||||
static void stack_capture(struct stack *st, struct frame *fp);
|
||||
static void stack_capture(struct stack *st, struct frame *frame);
|
||||
|
||||
static void
|
||||
stack_capture(struct stack *st, struct frame *fp)
|
||||
stack_capture(struct stack *st, struct frame *frame)
|
||||
{
|
||||
struct frame *fp;
|
||||
vm_offset_t callpc;
|
||||
|
||||
stack_zero(st);
|
||||
while (1) {
|
||||
fp = frame;
|
||||
for (;;) {
|
||||
if (!INKERNEL((vm_offset_t)fp) ||
|
||||
!ALIGNED_POINTER(fp, uint64_t))
|
||||
break;
|
||||
callpc = fp->fr_pc;
|
||||
if (!INKERNEL(callpc))
|
||||
break;
|
||||
if (stack_put(st, callpc) == -1)
|
||||
break;
|
||||
if (v9next_frame(fp) <= fp ||
|
||||
v9next_frame(fp) >= frame + KSTACK_PAGES * PAGE_SIZE)
|
||||
break;
|
||||
fp = v9next_frame(fp);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user