gdb/testsuite: add test for Python commands redefining itself
authorJan Vrany <jan.vrany@labware.com>
Fri, 16 Dec 2022 11:38:28 +0000 (11:38 +0000)
committerJan Vrany <jan.vrany@labware.com>
Fri, 16 Dec 2022 11:38:28 +0000 (11:38 +0000)
This commit adds a test that creates a Python command that redefines
itself during its execution. This is to test use-after-free in
execute_command ().

This test needs run with ASan enabled in order to fail when it
should.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
gdb/testsuite/gdb.python/py-cmd.exp

index aa95a459f460b94bd53ed76f94555099b5206685..48c3e18f1cc28a032c83052a0085095f447d5565 100644 (file)
@@ -300,3 +300,33 @@ gdb_test_multiple "test_multiline" $test {
        pass $test
     }
 }
+
+# Test command redefining itself
+
+proc_with_prefix test_command_redefining_itself {} {
+    # Start with a fresh gdb
+    clean_restart
+
+
+    gdb_test_multiline "input command redefining itself" \
+       "python" "" \
+       "class redefine_cmd (gdb.Command):" "" \
+       "  def __init__ (self, msg):" "" \
+       "    super (redefine_cmd, self).__init__ (\"redefine_cmd\", gdb.COMMAND_OBSCURE)" "" \
+       "    self._msg = msg" "" \
+       "  def invoke (self, arg, from_tty):" "" \
+       "    print (\"redefine_cmd output, msg = %s\" % self._msg)" "" \
+       "    redefine_cmd (arg)" "" \
+       "redefine_cmd (\"XXX\")" "" \
+       "end" ""
+
+    gdb_test "redefine_cmd AAA" \
+       "redefine_cmd output, msg = XXX" \
+       "call command redefining itself 1"
+
+    gdb_test "redefine_cmd BBB" \
+       "redefine_cmd output, msg = AAA" \
+       "call command redefining itself 2"
+}
+
+test_command_redefining_itself