diff options
author | Doug Evans <dje@google.com> | 2015-04-28 21:53:54 -0700 |
---|---|---|
committer | Doug Evans <dje@google.com> | 2015-04-28 21:53:54 -0700 |
commit | 69b4374a87e5029ac4831c7a4471815514df662f (patch) | |
tree | 9041be61ebe1e1bd8df326650dd946102f15ae77 /gdb/python | |
parent | 5e7cf0784c9b543b1870b974a78244c40105c523 (diff) | |
download | binutils-gdb-69b4374a87e5029ac4831c7a4471815514df662f.tar.gz |
PR python/18089
gdb/ChangeLog:
PR python/18089
* python/py-prettyprint.c (print_children): Verify result of children
iterator. Provide better error message.
* python/python-internal..h (gdbpy_print_python_errors_p): Declare.
* python/python.c (gdbpy_print_python_errors_p): New function.
gdb/testsuite/ChangeLog:
* gdb.python/py-bad-printers.c: New file.
* gdb.python/py-bad-printers.py: New file.
* gdb.python/py-bad-printers.exp: New file.
Diffstat (limited to 'gdb/python')
-rw-r--r-- | gdb/python/py-prettyprint.c | 14 | ||||
-rw-r--r-- | gdb/python/python-internal.h | 1 | ||||
-rw-r--r-- | gdb/python/python.c | 8 |
3 files changed, 23 insertions, 0 deletions
diff --git a/gdb/python/py-prettyprint.c b/gdb/python/py-prettyprint.c index d8579fadf8f..274ac6c5940 100644 --- a/gdb/python/py-prettyprint.c +++ b/gdb/python/py-prettyprint.c @@ -554,8 +554,22 @@ print_children (PyObject *printer, const char *hint, break; } + if (! PyTuple_Check (item) || PyTuple_Size (item) != 2) + { + PyErr_SetString (PyExc_TypeError, + _("Result of children iterator not a tuple" + " of two elements.")); + gdbpy_print_stack (); + Py_DECREF (item); + continue; + } if (! PyArg_ParseTuple (item, "sO", &name, &py_v)) { + /* The user won't necessarily get a stack trace here, so provide + more context. */ + if (gdbpy_print_python_errors_p ()) + fprintf_unfiltered (gdb_stderr, + _("Bad result from children iterator.\n")); gdbpy_print_stack (); Py_DECREF (item); continue; diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index 0581b33f4df..55af10ed0ee 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -527,6 +527,7 @@ extern const struct language_defn *python_language; } \ } while (0) +int gdbpy_print_python_errors_p (void); void gdbpy_print_stack (void); PyObject *python_string_to_unicode (PyObject *obj); diff --git a/gdb/python/python.c b/gdb/python/python.c index 1da63fd5c0f..ee866805715 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -1182,6 +1182,14 @@ gdbpy_flush (PyObject *self, PyObject *args, PyObject *kw) Py_RETURN_NONE; } +/* Return non-zero if print-stack is not "none". */ + +int +gdbpy_print_python_errors_p (void) +{ + return gdbpy_should_print_stack != python_excp_none; +} + /* Print a python exception trace, print just a message, or print nothing and clear the python exception, depending on gdbpy_should_print_stack. Only call this if a python exception is |