]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Fix some error-handling bugs in python frame filters
authorTom Tromey <tom@tromey.com>
Mon, 31 Oct 2016 17:10:35 +0000 (11:10 -0600)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Thu, 12 Jan 2017 17:03:20 +0000 (18:03 +0100)
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.

gdb/ChangeLog
gdb/python/py-framefilter.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-framefilter.py

index 0aaae46e71d8982633b8116af914e086dbcb4d81..397dbae160f2619124a8678defd6ffa69c28f6fe 100644 (file)
@@ -1,3 +1,8 @@
+2017-01-12  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-12-20  Pedro Alves  <palves@redhat.com>
 
        PR gdb/20977
index 0c77a150c70373df7b5bfe209064b4281ec74a3d..b82c6d221a29c65c574ed7387c9cbb804bc80bcf 100644 (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, ":");
index 320f48cd6a6c287a7994a0eda2940eacd1b9ca09..33ee59fea20c8ff2c3db9e98cae07548fd2c31c3 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-08  Tom Tromey  <tom@tromey.com>
+
+       * gdb.python/py-framefilter.py (ElidingFrameDecorator.address):
+       New method.
+
 2016-10-06  Maciej W. Rozycki  <macro@imgtec.com>
 
        * gdb.arch/mips-fcr.exp: New test.
index fe4ca6f3f94a6a6d256f1217bf4dc1aac3d68eff..edd0e00fe6facbe31de88c9a9d3349a7145d24bb 100644 (file)
@@ -92,6 +92,12 @@ class ElidingFrameDecorator(FrameDecorator):
     def elided(self):
         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:
     def __init__(self, ii):
         self.input_iterator = ii