binutils-gdb/gdb/python
Simon Marchi b1ce65684d Fix Py_DECREF being executed without holding the GIL
When the gdbpy_ref objects get destroyed, they call Py_DECREF to
decrement the reference counter of the python object they hold a
reference to.  Any time we call into the Python API, we should be
holding the GIL.  The gdbpy_enter object does that for us in an
RAII-fashion.

However, if gdbpy_enter is declared after a gdbpy_ref object in a
function, gdbpy_enter's destructor will be called (and the GIL will be
released) before gdbpy_ref's destructor is called.  Therefore, we will
end up calling Py_DECREF without holding the GIL.

This became obvious with Python 3.6, where memory management functions
have asserts to make sure that the GIL is held.  This was exposed by
tests py-as-string.exp, py-function.exp and py-xmethods.  For example:

  (gdb) p $_as_string(enum_valid)
  Fatal Python error: Python memory allocator called without holding the GIL

  Current thread 0x00007f7f7b21c780 (most recent call first):
  [1]    18678 abort (core dumped)  ./gdb -nx testsuite/outputs/gdb.python/py-as-string/py-as-string

  #0  0x00007ffff618bc37 in raise () from /lib/x86_64-linux-gnu/libc.so.6
  #1  0x00007ffff618f028 in abort () from /lib/x86_64-linux-gnu/libc.so.6
  #2  0x00007ffff6b104d6 in Py_FatalError (msg=msg@entry=0x7ffff6ba15b8 "Python memory allocator called without holding the GIL") at Python/pylifecycle.c:1457
  #3  0x00007ffff6a37a68 in _PyMem_DebugCheckGIL () at Objects/obmalloc.c:1972
  #4  0x00007ffff6a3804e in _PyMem_DebugFree (ctx=0x7ffff6e65290 <_PyMem_Debug+48>, ptr=0x24f8830) at Objects/obmalloc.c:1994
  #5  0x00007ffff6a38e1d in PyMem_Free (ptr=<optimized out>) at Objects/obmalloc.c:442
  #6  0x00007ffff6b866c6 in _PyFaulthandler_Fini () at ./Modules/faulthandler.c:1369
  #7  0x00007ffff6b104bd in Py_FatalError (msg=msg@entry=0x7ffff6ba15b8 "Python memory allocator called without holding the GIL") at Python/pylifecycle.c:1431
  #8  0x00007ffff6a37a68 in _PyMem_DebugCheckGIL () at Objects/obmalloc.c:1972
  #9  0x00007ffff6a3804e in _PyMem_DebugFree (ctx=0x7ffff6e652c0 <_PyMem_Debug+96>, ptr=0x7ffff46b6040) at Objects/obmalloc.c:1994
  #10 0x00007ffff6a38f55 in PyObject_Free (ptr=<optimized out>) at Objects/obmalloc.c:503
  #11 0x00007ffff6a5f27e in unicode_dealloc (unicode=unicode@entry=0x7ffff46b6040) at Objects/unicodeobject.c:1794
  #12 0x00007ffff6a352a9 in _Py_Dealloc (op=0x7ffff46b6040) at Objects/object.c:1786
  #13 0x000000000063f28b in gdb_Py_DECREF (op=0x7ffff46b6040) at /home/emaisin/src/binutils-gdb/gdb/python/python-internal.h:192
  #14 0x000000000063fa33 in gdbpy_ref_policy::decref (ptr=0x7ffff46b6040) at /home/emaisin/src/binutils-gdb/gdb/python/py-ref.h:35
  #15 0x000000000063fa77 in gdb::ref_ptr<_object, gdbpy_ref_policy>::~ref_ptr (this=0x7fffffffcdf0, __in_chrg=<optimized out>) at /home/emaisin/src/binutils-gdb/gdb/common/gdb_ref_ptr.h:91
  #16 0x000000000064d8b8 in fnpy_call (gdbarch=0x2b50010, language=0x115d2c0 <c_language_defn>, cookie=0x7ffff46b7468, argc=1, argv=0x7fffffffcf48)
    at /home/emaisin/src/binutils-gdb/gdb/python/py-function.c:145

The fix is to place the gdbpy_enter first in the function.  I also
cleaned up the comments a bit and removed the unnecessary initialization
of the value variable.

gdb/ChangeLog:

	* python/py-function.c (fnpy_call): Reorder declarations to have
	the gdbpy_enter object declared first.
	* python/py-xmethods.c (gdbpy_get_xmethod_arg_types): Likewise.
2017-01-20 21:06:51 -05:00
..
lib/gdb update copyright year range in GDB files 2017-01-01 10:52:34 +04:00
py-arch.c Use gdbpy_ref in archpy_disassemble 2017-01-10 19:13:59 -07:00
py-auto-load.c update copyright year range in GDB files 2017-01-01 10:52:34 +04:00
py-block.c update copyright year range in GDB files 2017-01-01 10:52:34 +04:00
py-bpevent.c Change event code to use gdbpy_ref 2017-01-10 19:13:29 -07:00
py-breakpoint.c Use gdbpy_ref in gdbpy_breakpoint_cond_says_stop 2017-01-10 19:14:00 -07:00
py-cmd.c Use gdbpy_ref in py-cmd.c 2017-01-10 19:14:01 -07:00
py-continueevent.c Change event code to use gdbpy_ref 2017-01-10 19:13:29 -07:00
py-event.c Change event code to use gdbpy_ref 2017-01-10 19:13:29 -07:00
py-event.h Change event code to use gdbpy_ref 2017-01-10 19:13:29 -07:00
py-events.h update copyright year range in GDB files 2017-01-01 10:52:34 +04:00
py-evtregistry.c update copyright year range in GDB files 2017-01-01 10:52:34 +04:00
py-evts.c update copyright year range in GDB files 2017-01-01 10:52:34 +04:00
py-exitedevent.c Change event code to use gdbpy_ref 2017-01-10 19:13:29 -07:00
py-finishbreakpoint.c Use gdbpy_ref in bpfinishpy_out_of_scope 2017-01-10 19:14:01 -07:00
py-frame.c update copyright year range in GDB files 2017-01-01 10:52:34 +04:00
py-framefilter.c Use gdbpy_ref rather than make_cleanup_py_decref 2017-01-10 19:14:07 -07:00
py-function.c Fix Py_DECREF being executed without holding the GIL 2017-01-20 21:06:51 -05:00
py-gdb-readline.c Fix python-interactive with Python 3.6 2017-01-20 20:39:08 -05:00
py-inferior.c Use gdbpy_ref in py-inferior.c 2017-01-10 19:14:03 -07:00
py-infevents.c Change event code to use gdbpy_ref 2017-01-10 19:13:29 -07:00
py-infthread.c update copyright year range in GDB files 2017-01-01 10:52:34 +04:00
py-lazy-string.c Change type of encoding argument to gdbpy_extract_lazy_string 2017-01-10 19:13:55 -07:00
py-linetable.c Use gdbpy_ref in py-linetable.c 2017-01-10 19:13:34 -07:00
py-newobjfileevent.c Change event code to use gdbpy_ref 2017-01-10 19:13:29 -07:00
py-objfile.c Use class to manage BFD reference counts 2017-01-10 19:14:10 -07:00
py-param.c Use gdbpy_ref in py-param.c 2017-01-10 19:14:04 -07:00
py-prettyprint.c Use gdbpy_ref in py-prettyprint.c 2017-01-10 19:13:58 -07:00
py-progspace.c Use gdbpy_enter in py-progspace.c 2017-01-10 19:13:42 -07:00
py-ref.h Add gdb_ref_ptr.h 2017-01-10 19:14:09 -07:00
py-signalevent.c Change event code to use gdbpy_ref 2017-01-10 19:13:29 -07:00
py-stopevent.c Change event code to use gdbpy_ref 2017-01-10 19:13:29 -07:00
py-stopevent.h update copyright year range in GDB files 2017-01-01 10:52:34 +04:00
py-symbol.c Use gdbpy_ref in gdbpy_lookup_symbol 2017-01-10 19:13:38 -07:00
py-symtab.c update copyright year range in GDB files 2017-01-01 10:52:34 +04:00
py-threadevent.c Change event code to use gdbpy_ref 2017-01-10 19:13:29 -07:00
py-type.c Add constructor and destructor to demangle_parse_info 2017-01-10 19:14:15 -07:00
py-unwind.c Use gdbpy_ref in pyuw_object_attribute_to_pointer 2017-01-10 19:14:05 -07:00
py-utils.c Remove make_cleanup_py_decref and make_cleanup_py_xdecref 2017-01-10 19:14:08 -07:00
py-value.c Add scoped_value_mark 2017-01-10 19:14:12 -07:00
py-varobj.c Use gdbpy_enter_varobj in py-varobj.c 2017-01-10 19:13:51 -07:00
py-xmethods.c Fix Py_DECREF being executed without holding the GIL 2017-01-20 21:06:51 -05:00
python-config.py
python-internal.h Fix python-interactive with Python 3.6 2017-01-20 20:39:08 -05:00
python.c Remove cleanups from execute_gdb_command 2017-01-10 19:14:14 -07:00
python.h update copyright year range in GDB files 2017-01-01 10:52:34 +04:00