diff options
Diffstat (limited to 'gdbserver')
-rw-r--r-- | gdbserver/regcache.cc | 5 | ||||
-rw-r--r-- | gdbserver/server.cc | 29 |
2 files changed, 31 insertions, 3 deletions
diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index ee0c1b3..96855f0 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -353,8 +353,7 @@ supply_register_by_name_zeroed (struct regcache *regcache, #endif /* Supply the whole register set whose contents are stored in BUF, to - REGCACHE. If BUF is NULL, all the registers' values are recorded - as unavailable. */ + REGCACHE. */ void supply_regblock (struct regcache *regcache, const void *buf) @@ -503,7 +502,7 @@ regcache::raw_compare (int regnum, const void *buf, int offset) const gdb_assert (buf != NULL); gdb::array_view<const gdb_byte> regbuf = register_data (this, regnum); - gdb_assert (offset < regbuf.size ()); + gdb_assert (offset <= regbuf.size ()); regbuf = regbuf.slice (offset); return memcmp (buf, regbuf.data (), regbuf.size ()) == 0; diff --git a/gdbserver/server.cc b/gdbserver/server.cc index def01c1..3172cd1 100644 --- a/gdbserver/server.cc +++ b/gdbserver/server.cc @@ -4071,6 +4071,33 @@ test_memory_tagging_functions (void) && tags.size () == 5); } +/* Exercise the behavior of doing a 0-length comparison for a register in a + register buffer, which should return true. */ + +static void test_registers_raw_compare_zero_length () +{ + /* Start off with a dummy target description. */ + target_desc dummy_tdesc; + + /* Make it 8 bytes long. */ + dummy_tdesc.registers_size = 8; + + /* Add a couple dummy 32-bit registers. */ + dummy_tdesc.reg_defs.emplace_back ("r0", 0, 32); + dummy_tdesc.reg_defs.emplace_back ("r1", 32, 32); + + /* Create our dummy register cache so we can invoke the raw_compare method + we want to validate. */ + regcache dummy_regcache (&dummy_tdesc); + + /* Create a dummy byte buffer we can pass to the raw_compare method. */ + gdb_byte dummy_buffer[8]; + + /* Validate the 0-length comparison (due to the comparison offset being + equal to the length of the register) returns true. */ + SELF_CHECK (dummy_regcache.raw_compare (0, dummy_buffer, 4)); +} + } /* namespace selftests */ #endif /* GDB_SELF_TEST */ @@ -4094,6 +4121,8 @@ captured_main (int argc, char *argv[]) selftests::register_test ("remote_memory_tagging", selftests::test_memory_tagging_functions); + selftests::register_test ("test_registers_raw_compare_zero_length", + selftests::test_registers_raw_compare_zero_length); #endif current_directory = getcwd (NULL, 0); |