From ba569a7ebe749ea925008baf2b8ff4d1e4cd6cef Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Sun, 27 Aug 2017 18:36:25 +0200 Subject: ddb: More gracefully handle address errors * i386/i386/db_interface.h (db_read_bytes): Return boolean_t instead of void. * i386/i386/db_interface.c (db_user_to_kernel_address): Return -1 instead of calling db_error() if address is bogus. (db_read_bytes): Return FALSE instead of calling db_error() if address is bogus. * ddb/db_access.c (db_get_task_value): Return 0 if db_read_bytes failed. * ddb/db_examine.c (db_xcdump): Only print * if db_read_bytes failed. --- ddb/db_access.c | 3 ++- ddb/db_examine.c | 5 ++++- i386/i386/db_interface.c | 12 +++++------- i386/i386/db_interface.h | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/ddb/db_access.c b/ddb/db_access.c index 16d4d3ef..509c1ba4 100644 --- a/ddb/db_access.c +++ b/ddb/db_access.c @@ -72,7 +72,8 @@ db_get_task_value( db_expr_t value; int i; - db_read_bytes(addr, size, data, task); + if (!db_read_bytes(addr, size, data, task)) + return 0; value = 0; #if BYTE_MSF diff --git a/ddb/db_examine.c b/ddb/db_examine.c index 836b0e89..6f94b686 100644 --- a/ddb/db_examine.c +++ b/ddb/db_examine.c @@ -473,7 +473,10 @@ db_xcdump( if (!DB_CHECK_ACCESS(next_page_addr, sizeof(int), task)) bcount = next_page_addr - addr; } - db_read_bytes(addr, bcount, data, task); + if (!db_read_bytes(addr, bcount, data, task)) { + db_printf("*\n"); + continue; + } for (i = 0; i < bcount && off != 0; i += size) { if (i % 4 == 0) db_printf(" "); diff --git a/i386/i386/db_interface.c b/i386/i386/db_interface.c index b3fac0bb..aac29395 100644 --- a/i386/i386/db_interface.c +++ b/i386/i386/db_interface.c @@ -446,8 +446,6 @@ db_user_to_kernel_address( } if (flag) { db_printf("\nno memory is assigned to address %08x\n", addr); - db_error(0); - /* NOTREACHED */ } return(-1); } @@ -459,7 +457,7 @@ db_user_to_kernel_address( * Read bytes from kernel address space for debugger. */ -void +boolean_t db_read_bytes( vm_offset_t addr, int size, @@ -477,17 +475,16 @@ db_read_bytes( while (--size >= 0) { if (addr < VM_MIN_KERNEL_ADDRESS && task == TASK_NULL) { db_printf("\nbad address %x\n", addr); - db_error(0); - /* NOTREACHED */ + return FALSE; } addr++; *data++ = *src++; } - return; + return TRUE; } while (size > 0) { if (db_user_to_kernel_address(task, addr, &kern_addr, 1) < 0) - return; + return FALSE; src = (char *)kern_addr; n = intel_trunc_page(addr+INTEL_PGBYTES) - addr; if (n > size) @@ -497,6 +494,7 @@ db_read_bytes( while (--n >= 0) *data++ = *src++; } + return TRUE; } /* diff --git a/i386/i386/db_interface.h b/i386/i386/db_interface.h index 9ffb6a60..18ee3291 100644 --- a/i386/i386/db_interface.h +++ b/i386/i386/db_interface.h @@ -32,7 +32,7 @@ extern boolean_t kdb_trap ( int code, struct i386_saved_state *regs); -extern void db_read_bytes ( +extern boolean_t db_read_bytes ( vm_offset_t addr, int size, char *data, -- cgit v1.2.3