]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit
gdb/python: stop using PyObject_IsInstance in py-disasm.c
authorAndrew Burgess <aburgess@redhat.com>
Tue, 22 Apr 2025 20:31:02 +0000 (21:31 +0100)
committerAndrew Burgess <aburgess@redhat.com>
Wed, 23 Apr 2025 14:41:35 +0000 (15:41 +0100)
commitdff7f6c72d05d8a378dc346e6900ba7c4eba759f
tree0a5f7ae2e90402f36fcc8fa77cdaff696275cdba
parent65ab41b7d5c612b6000b28f4c50bb256b2a9e22b
gdb/python: stop using PyObject_IsInstance in py-disasm.c

The PyObject_IsInstance function can return -1 for errors, 0 to
indicate false, and 1 to indicate true.

I noticed in python/py-disasm.c that we treat the result of
PyObject_IsInstance as a bool.  This means that if PyObject_IsInstance
returns -1, then this will be treated as true.  The consequence of
this is that we will invoke undefined behaviour by treating the result
from the _print_insn call as if it was a DisassemblerResult object,
even though PyObject_IsInstance raised an error, and the result might
not be of the required type.

I could fix this by taking the -1 result into account, however,
gdb.DisassemblerResult cannot be sub-classed, the type doesn't have
the Py_TPFLAGS_BASETYPE flag.  As such, we can switch to using
PyObject_TypeCheck instead, which only return 0 or 1, with no error
case.

I have also taken the opportunity to improve the error message emitted
if the result has the wrong type.  Better error message make debugging
issues easier.

I've added a test which exposes the problem when using
PyObject_IsInstance, and I've updated the existing test for the
improved error message.

Approved-By: Tom Tromey <tom@tromey.com>
gdb/python/py-disasm.c
gdb/testsuite/gdb.python/py-disasm.exp.tcl
gdb/testsuite/gdb.python/py-disasm.py