diff options
author | Tom Tromey <tom@tromey.com> | 2016-10-31 11:10:35 -0600 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2017-01-12 18:03:20 +0100 |
commit | df1fe27b672d7aa054eaad8b51f86302f7e46c65 (patch) | |
tree | 3302336665d9cfbf8b8883de482dc56dee3a1103 /gdb/python | |
parent | e11d96aec4008de21f650c1cee08fea427189551 (diff) | |
download | gdb-df1fe27b672d7aa054eaad8b51f86302f7e46c65.zip gdb-df1fe27b672d7aa054eaad8b51f86302f7e46c65.tar.gz gdb-df1fe27b672d7aa054eaad8b51f86302f7e46c65.tar.bz2 |
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.
Diffstat (limited to 'gdb/python')
-rw-r--r-- | gdb/python/py-framefilter.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c index 0c77a15..b82c6d2 100644 --- a/gdb/python/py-framefilter.c +++ b/gdb/python/py-framefilter.c @@ -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, ":"); |