Page MenuHomeFreeBSD

D41532.id126544.diff
No OneTemporary

D41532.id126544.diff

diff --git a/sys/amd64/amd64/db_trace.c b/sys/amd64/amd64/db_trace.c
--- a/sys/amd64/amd64/db_trace.c
+++ b/sys/amd64/amd64/db_trace.c
@@ -142,6 +142,7 @@
db_nextframe(struct amd64_frame **fp, db_addr_t *ip, struct thread *td)
{
struct trapframe *tf;
+ uintptr_t tf_addr;
int frame_type;
long rip, rsp, rbp;
db_expr_t offset;
@@ -204,29 +205,34 @@
* Point to base of trapframe which is just above the
* current frame.
*/
- tf = (struct trapframe *)((long)*fp + 16);
+ tf_addr = (uintptr_t)*fp + 16;
- if (INKERNEL((long) tf)) {
- rsp = tf->tf_rsp;
- rip = tf->tf_rip;
- rbp = tf->tf_rbp;
- switch (frame_type) {
- case TRAP:
- db_printf("--- trap %#r", tf->tf_trapno);
- break;
- case SYSCALL:
- db_printf("--- syscall");
- db_decode_syscall(td, tf->tf_rax);
- break;
- case INTERRUPT:
- db_printf("--- interrupt");
- break;
- default:
- panic("The moon has moved again.");
- }
- db_printf(", rip = %#lr, rsp = %#lr, rbp = %#lr ---\n", rip,
- rsp, rbp);
+ if (!__is_aligned(tf_addr, _Alignof(*tf)) || !INKERNEL(tf_addr)) {
+ db_printf("--- invalid trapframe %p\n", (void *)tf_addr);
+ *ip = 0;
+ *fp = NULL;
+ return;
}
+ tf = (struct trapframe *)tf_addr;
+
+ rsp = tf->tf_rsp;
+ rip = tf->tf_rip;
+ rbp = tf->tf_rbp;
+ switch (frame_type) {
+ case TRAP:
+ db_printf("--- trap %#r", tf->tf_trapno);
+ break;
+ case SYSCALL:
+ db_printf("--- syscall");
+ db_decode_syscall(td, tf->tf_rax);
+ break;
+ case INTERRUPT:
+ db_printf("--- interrupt");
+ break;
+ default:
+ __assert_unreachable();
+ }
+ db_printf(", rip = %#lr, rsp = %#lr, rbp = %#lr ---\n", rip, rsp, rbp);
*ip = (db_addr_t) rip;
*fp = (struct amd64_frame *) rbp;
@@ -318,14 +324,18 @@
}
db_nextframe(&frame, &pc, td);
-
- if (INKERNEL((long)pc) && !INKERNEL((long)frame)) {
- sym = db_search_symbol(pc, DB_STGY_ANY, &offset);
- db_symbol_values(sym, &name, NULL);
- db_print_stack_entry(name, pc, frame);
+ if (frame == NULL)
break;
- }
- if (!INKERNEL((long) frame)) {
+
+ if (!__is_aligned(frame, _Alignof(*frame)) ||
+ !INKERNEL((uintptr_t)frame)) {
+ if (INKERNEL(pc)) {
+ sym = db_search_symbol(pc, DB_STGY_ANY,
+ &offset);
+ db_symbol_values(sym, &name, NULL);
+ db_print_stack_entry(name, pc, frame);
+ break;
+ }
break;
}
}

File Metadata

Mime Type
text/plain
Expires
Sat, Aug 29, 8:24 PM (4 h, 18 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
37516407
Default Alt Text
D41532.id126544.diff (2 KB)

Event Timeline