forked from Imagelibrary/binutils-gdb
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:
@@ -1,3 +1,8 @@
|
|||||||
|
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 Yao Qi <yao.qi@linaro.org>
|
2016-11-08 Yao Qi <yao.qi@linaro.org>
|
||||||
|
|
||||||
* ada-lang.h (ada_val_print): Remove second parameter. Remove
|
* ada-lang.h (ada_val_print): Remove second parameter. Remove
|
||||||
|
|||||||
@@ -1116,7 +1116,13 @@ py_print_frame (PyObject *filter, int flags,
|
|||||||
|
|
||||||
if (paddr != Py_None)
|
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;
|
has_addr = 1;
|
||||||
}
|
}
|
||||||
Py_DECREF (paddr);
|
Py_DECREF (paddr);
|
||||||
@@ -1213,10 +1219,10 @@ py_print_frame (PyObject *filter, int flags,
|
|||||||
}
|
}
|
||||||
else if (PyLong_Check (py_func))
|
else if (PyLong_Check (py_func))
|
||||||
{
|
{
|
||||||
CORE_ADDR addr = PyLong_AsUnsignedLongLong (py_func);
|
CORE_ADDR addr;
|
||||||
struct bound_minimal_symbol msymbol;
|
struct bound_minimal_symbol msymbol;
|
||||||
|
|
||||||
if (PyErr_Occurred ())
|
if (get_addr_from_python (py_func, &addr) < 0)
|
||||||
{
|
{
|
||||||
do_cleanups (cleanup_stack);
|
do_cleanups (cleanup_stack);
|
||||||
return EXT_LANG_BT_ERROR;
|
return EXT_LANG_BT_ERROR;
|
||||||
@@ -1340,6 +1346,12 @@ py_print_frame (PyObject *filter, int flags,
|
|||||||
if (py_line != Py_None)
|
if (py_line != Py_None)
|
||||||
{
|
{
|
||||||
line = PyLong_AsLong (py_line);
|
line = PyLong_AsLong (py_line);
|
||||||
|
if (PyErr_Occurred ())
|
||||||
|
{
|
||||||
|
do_cleanups (cleanup_stack);
|
||||||
|
return EXT_LANG_BT_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
TRY
|
TRY
|
||||||
{
|
{
|
||||||
ui_out_text (out, ":");
|
ui_out_text (out, ":");
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
2016-11-08 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
|
* gdb.python/py-framefilter.py (ElidingFrameDecorator.address):
|
||||||
|
New method.
|
||||||
|
|
||||||
2016-10-29 Manish Goregaokar <manish@mozilla.com>
|
2016-10-29 Manish Goregaokar <manish@mozilla.com>
|
||||||
|
|
||||||
* gdb.rust/simple.exp: Add tests for `sizeof(expr)`
|
* gdb.rust/simple.exp: Add tests for `sizeof(expr)`
|
||||||
|
|||||||
@@ -92,6 +92,12 @@ class ElidingFrameDecorator(FrameDecorator):
|
|||||||
def elided(self):
|
def elided(self):
|
||||||
return iter(self.elided_frames)
|
return iter(self.elided_frames)
|
||||||
|
|
||||||
|
def address (self):
|
||||||
|
# Regression test for an overflow in the python layer.
|
||||||
|
bitsize = 8 * gdb.lookup_type('void').pointer().sizeof
|
||||||
|
mask = (1 << bitsize) - 1
|
||||||
|
return 0xffffffffffffffff & mask
|
||||||
|
|
||||||
class ElidingIterator:
|
class ElidingIterator:
|
||||||
def __init__(self, ii):
|
def __init__(self, ii):
|
||||||
self.input_iterator = ii
|
self.input_iterator = ii
|
||||||
|
|||||||
Reference in New Issue
Block a user