]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb/python: missing PyObject_IsTrue error check in bppy_init
authorAndrew Burgess <aburgess@redhat.com>
Sun, 10 Nov 2024 19:58:25 +0000 (19:58 +0000)
committerAndrew Burgess <aburgess@redhat.com>
Thu, 14 Nov 2024 19:34:44 +0000 (19:34 +0000)
As with the previous two commits, this commit fixes a location where
we called PyObject_IsTrue without including an error check, this time
in bppy_init.

The 'qualified' argument is supposed to be a bool, the docs say:

  The optional QUALIFIED argument is a boolean that allows
  interpreting the function passed in 'spec' as a fully-qualified
  name.  It is equivalent to 'break''s '-qualified' flag (*note
  Linespec Locations:: and *note Explicit Locations::).

It's not totally clear that the only valid values are True or False,
but I'm choosing to interpret the docs that way, and so I've added a
PyBool_Type check during argument parsing.  Now, if a non-bool is
passed the user will get a TypeError during argument parsing.  I've
added a test to cover this case.

This is a potentially breaking change to the Python API, but hopefully
this will not impact too many people.  I've added a NEWS entry to
highlight this change.

Reviewed-By: Eli Zaretskii <eliz@gnu.org>
Approved-By: Tom Tromey <tom@tromey.com>
gdb/NEWS
gdb/python/py-breakpoint.c
gdb/testsuite/gdb.python/py-breakpoint.exp

index 647b7256b462ed92c6dd7526c578a4d34ae349da..964183910dce028d2fd1ddb6270902f8b484859e 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -75,6 +75,9 @@
   ** The gdb.MICommand.installed property can only be set to True or
      False.
 
+  ** The 'qualified' argument to gdb.Breakpoint constructor will no
+     longer accept non-bool types.
+
 * Debugger Adapter Protocol changes
 
   ** The "scopes" request will now return a scope holding global
index 1edd55672645d9702c19123452a4a4d29615af9f..752917cef81c46731c5ebe81beda91e3c5d932ef 100644 (file)
@@ -927,14 +927,14 @@ bppy_init (PyObject *self, PyObject *args, PyObject *kwargs)
   char *label = NULL;
   char *source = NULL;
   char *function = NULL;
-  PyObject * qualified = NULL;
+  PyObject *qualified = Py_False;
 
-  if (!gdb_PyArg_ParseTupleAndKeywords (args, kwargs, "|siiOOsssOO", keywords,
+  if (!gdb_PyArg_ParseTupleAndKeywords (args, kwargs, "|siiOOsssOO!", keywords,
                                        &spec, &type, &access_type,
                                        &internal,
                                        &temporary, &source,
                                        &function, &label, &lineobj,
-                                       &qualified))
+                                       &PyBool_Type, &qualified))
     return -1;
 
 
@@ -982,10 +982,11 @@ bppy_init (PyObject *self, PyObject *args, PyObject *kwargs)
        case bp_hardware_breakpoint:
          {
            location_spec_up locspec;
+           gdb_assert (PyBool_Check (qualified));
            symbol_name_match_type func_name_match_type
-             = (qualified != NULL && PyObject_IsTrue (qualified)
-                 ? symbol_name_match_type::FULL
-                 : symbol_name_match_type::WILD);
+             = (qualified == Py_True
+                ? symbol_name_match_type::FULL
+                : symbol_name_match_type::WILD);
 
            if (spec != NULL)
              {
index 934690db2a109b2f77d83f1857d0462a155acf52..6f9245c75c6eaf7209938627a5af46cd0f538580 100644 (file)
@@ -792,6 +792,15 @@ proc_with_prefix test_bkpt_qualified {} {
        $one_location_re \
        "qualified true"
 
+    # Test qualified with a non-bool type.
+    delete_breakpoints
+    gdb_test \
+       "python gdb.Breakpoint(\"multiply\", qualified=None)" \
+       [multi_line \
+            "Python Exception <class 'TypeError'>: argument 10 must be bool, not None" \
+            "Error occurred in Python: argument 10 must be bool, not None"] \
+       "qualified non_bool_type"
+
     # Test qualified=True with an explicit function.
     delete_breakpoints
     gdb_test \