From a06a12e15b223443ac554c938d7d6b995974a0a5 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Sun, 8 Jan 2017 13:00:47 +0100 Subject: [PATCH] Fix Python backtraces for 32-bit inferiors (Tom Tromey, RH BZ 1411094). --- gdb-upstream.patch | 136 +++++++++++++++++++++++++++++++++++++++++++++ gdb.spec | 5 +- 2 files changed, 140 insertions(+), 1 deletion(-) diff --git a/gdb-upstream.patch b/gdb-upstream.patch index 2ba72db..3ab99e3 100644 --- a/gdb-upstream.patch +++ b/gdb-upstream.patch @@ -458,3 +458,139 @@ index 378eea0..7d9b198 100644 --IS0zKkzwUGydFO0o-- + + +https://bugzilla.redhat.com/show_bug.cgi?id=1411094 +http://sourceware.org/ml/gdb-patches/2016-11/msg00076.html +Subject: Re: [RFA 1/2] Fix some error-handling bugs in python frame filters + +>>>>> "Tom" == Tom Tromey writes: + +Tom> I've included a test case for the first issue. + +I did a -m32 build here and have fixed up the test case. +Here's the new patch. This is ready to review now. + +Tom + +commit 981628a4af5f82a12351b9764437927d3a8c8169 +Author: Tom Tromey +Date: Mon Oct 31 11:10:35 2016 -0600 + + 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-10-31 Tom Tromey + + * python/py-framefilter.c (py_print_frame): Use + get_addr_from_python. Check for errors when getting line number. + + 2016-10-31 Tom Tromey + + * gdb.python/py-framefilter.py (ElidingFrameDecorator.address): + New method. + +diff --git a/gdb/ChangeLog b/gdb/ChangeLog +index 1fd85ce..98fcd21 100644 +### a/gdb/ChangeLog +### b/gdb/ChangeLog +## -1,3 +1,8 @@ ++2016-10-31 Tom Tromey ++ ++ * python/py-framefilter.c (py_print_frame): Use ++ get_addr_from_python. Check for errors when getting line number. ++ + 2016-11-03 Yao Qi + + * Makefile.in (.y.c): Replace YY_NULL with YY_NULLPTR. +diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c +index 6692ac5..4c7757c 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, ":"); +diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog +index 52038e3..d8466f1 100644 +### a/gdb/testsuite/ChangeLog +### b/gdb/testsuite/ChangeLog +## -1,3 +1,8 @@ ++2016-10-31 Tom Tromey ++ ++ * gdb.python/py-framefilter.py (ElidingFrameDecorator.address): ++ New method. ++ + 2016-10-28 Pedro Alves + + * gdb.base/maint.exp : Use +diff --git a/gdb/testsuite/gdb.python/py-framefilter.py b/gdb/testsuite/gdb.python/py-framefilter.py +index 8fdff84..2580911 100644 +--- a/gdb/testsuite/gdb.python/py-framefilter.py ++++ b/gdb/testsuite/gdb.python/py-framefilter.py +@@ -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 + diff --git a/gdb.spec b/gdb.spec index c3ed25f..efa2d68 100644 --- a/gdb.spec +++ b/gdb.spec @@ -26,7 +26,7 @@ Version: 7.12 # The release always contains a leading reserved number, start it at 1. # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing. -Release: 34%{?dist} +Release: 35%{?dist} License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain and GFDL Group: Development/Debuggers @@ -1583,6 +1583,9 @@ then fi %changelog +* Sun Jan 8 2017 Jan Kratochvil - 7.12-35.fc25 +- Fix Python backtraces for 32-bit inferiors (Tom Tromey, RH BZ 1411094). + * Fri Jan 6 2017 Jan Kratochvil - 7.12-34.fc25 - Fix gdb-add-index for 444 *.debug files.