Move the validation of the address range to tcg_insert_breakpoint, which has to deal with gdbstub inputs. Leave assertions behind in cpu_watchpoint_insert, but no error return path.
Signed-off-by: Richard Henderson <[email protected]> --- accel/tcg/tcg-accel-ops.c | 3 +++ system/watchpoint.c | 9 ++------- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/accel/tcg/tcg-accel-ops.c b/accel/tcg/tcg-accel-ops.c index 644c5b04a2..4dee5ea57f 100644 --- a/accel/tcg/tcg-accel-ops.c +++ b/accel/tcg/tcg-accel-ops.c @@ -143,6 +143,9 @@ static int tcg_insert_gdbstub_breakpoint(CPUState *cs, GdbBreakpointType type, case GDB_WATCHPOINT_WRITE: case GDB_WATCHPOINT_READ: case GDB_WATCHPOINT_ACCESS: + if (len == 0 || addr + (len - 1) < addr) { + return -EINVAL; + } CPU_FOREACH(cpu) { err = cpu_watchpoint_insert(cpu, addr, len, xlat_gdb_type(cpu, type), 0, NULL); diff --git a/system/watchpoint.c b/system/watchpoint.c index ed505da403..01cf0f61a8 100644 --- a/system/watchpoint.c +++ b/system/watchpoint.c @@ -18,7 +18,6 @@ */ #include "qemu/osdep.h" -#include "qemu/error-report.h" #include "exec/cputlb.h" #include "exec/target_page.h" #include "exec/breakpoint.h" @@ -33,12 +32,8 @@ int cpu_watchpoint_insert(CPUState *cpu, vaddr addr, vaddr len, vaddr last = addr + len - 1; vaddr in_page; - /* forbid ranges which are empty or run off the end of the address space */ - if (len == 0 || last < addr) { - error_report("tried to set invalid watchpoint at %" - VADDR_PRIx ", len=%" VADDR_PRIu, addr, len); - return -EINVAL; - } + assert(len != 0); + assert(last >= addr); wp = g_new0(CPUWatchpoint, 1); -- 2.43.0
