Fix some error-handling bugs in python frame filters

While writing a Python frame filter, I found a few bugs in the current
frame filter code.  In particular:

* One spot converts a Python long to a CORE_ADDR using PyLong_AsLong.
  However, this can fail on overflow.  I changed this to use
  get_addr_from_python.

* Another spot is doing the same but with PyLong_AsUnsignedLongLong; I
  changed this as well just for consistency.

* Converting line numbers can print "-1" if conversion from long
  fails.  This isn't fatal but just a bit ugly.

I've included a test case for the first issue.  The line number one
didn't seem important enough to bother with.

2016-11-08  Tom Tromey  <tom@tromey.com>

	* python/py-framefilter.c (py_print_frame): Use
	get_addr_from_python.  Check for errors when getting line number.

2016-11-08  Tom Tromey  <tom@tromey.com>

	* gdb.python/py-framefilter.py (ElidingFrameDecorator.address):
	New method.
This commit is contained in:
Tom Tromey 2016-10-31 11:10:35 -06:00
parent e8b24d9ff5
commit 30a7bb833c
4 changed files with 31 additions and 3 deletions

View file

@ -1116,7 +1116,13 @@ py_print_frame (PyObject *filter, int flags,
if (paddr != Py_None)
{
address = PyLong_AsLong (paddr);
if (get_addr_from_python (paddr, &address) < 0)
{
Py_DECREF (paddr);
do_cleanups (cleanup_stack);
return EXT_LANG_BT_ERROR;
}
has_addr = 1;
}
Py_DECREF (paddr);
@ -1213,10 +1219,10 @@ py_print_frame (PyObject *filter, int flags,
}
else if (PyLong_Check (py_func))
{
CORE_ADDR addr = PyLong_AsUnsignedLongLong (py_func);
CORE_ADDR addr;
struct bound_minimal_symbol msymbol;
if (PyErr_Occurred ())
if (get_addr_from_python (py_func, &addr) < 0)
{
do_cleanups (cleanup_stack);
return EXT_LANG_BT_ERROR;
@ -1340,6 +1346,12 @@ py_print_frame (PyObject *filter, int flags,
if (py_line != Py_None)
{
line = PyLong_AsLong (py_line);
if (PyErr_Occurred ())
{
do_cleanups (cleanup_stack);
return EXT_LANG_BT_ERROR;
}
TRY
{
ui_out_text (out, ":");