diff --git a/CMakeLists.txt b/CMakeLists.txt index 95ab4c2b5ba..0327d605641 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1650,6 +1650,7 @@ set(TESTS_WITHOUT_PROGRAM call_exit check_patched_pthread checkpoint_async_signal_syscalls_1000 + checkpoint_invalid checkpoint_mmap_shared checkpoint_prctl_name checkpoint_simple diff --git a/src/DebuggerExtensionCommand.cc b/src/DebuggerExtensionCommand.cc index fb2e216c52d..ef2ecc552d3 100644 --- a/src/DebuggerExtensionCommand.cc +++ b/src/DebuggerExtensionCommand.cc @@ -149,7 +149,11 @@ string invoke_delete_checkpoint(GdbServer& gdb_server, Task*, if (!gdb_server.timeline()) { return string("Command requires a full debugging session."); } - int id = stoi(args[0]); + char* endptr; + long id = strtol(args[0].c_str(), &endptr, 10); + if (*endptr) { + return string("Invalid checkpoint number ") + args[0] + "."; + } auto it = gdb_server.checkpoints.find(id); if (it != gdb_server.checkpoints.end()) { if (it->second.is_explicit == GdbServer::Checkpoint::EXPLICIT) { diff --git a/src/test/checkpoint_invalid.py b/src/test/checkpoint_invalid.py new file mode 100644 index 00000000000..18be4cc6911 --- /dev/null +++ b/src/test/checkpoint_invalid.py @@ -0,0 +1,21 @@ +from util import * + +send_gdb('delete checkpoint') +expect_gdb('requires an argument') + +send_gdb('delete checkpoint x') +expect_gdb('Invalid checkpoint number') + +send_gdb('delete checkpoint 0x1') +expect_gdb('Invalid checkpoint number') + +send_gdb('delete checkpoint -1') +expect_gdb('No checkpoint number') + +send_gdb('delete checkpoint 0') +expect_gdb('No checkpoint number') + +send_gdb('delete checkpoint 99999999999999999999999999999999999999999') +expect_gdb('No checkpoint number') + +ok() diff --git a/src/test/checkpoint_invalid.run b/src/test/checkpoint_invalid.run new file mode 100644 index 00000000000..ca00cd42aee --- /dev/null +++ b/src/test/checkpoint_invalid.run @@ -0,0 +1,3 @@ +source `dirname $0`/util.sh +record simple$bitness +debug_gdb_only checkpoint_invalid