summaryrefslogtreecommitdiff
path: root/gdb/python
diff options
context:
space:
mode:
authorDoug Evans <dje@google.com>2015-04-28 21:53:54 -0700
committerDoug Evans <dje@google.com>2015-04-28 21:53:54 -0700
commit69b4374a87e5029ac4831c7a4471815514df662f (patch)
tree9041be61ebe1e1bd8df326650dd946102f15ae77 /gdb/python
parent5e7cf0784c9b543b1870b974a78244c40105c523 (diff)
downloadbinutils-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.c14
-rw-r--r--gdb/python/python-internal.h1
-rw-r--r--gdb/python/python.c8
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