[gdb/f15] [python] Fix crash when pretty printer fails (Phil Muldoon, BZ 712715).
Jan Kratochvil
jankratochvil at fedoraproject.org
Wed Dec 21 18:07:52 UTC 2011
commit ccb21793c334eb857011eb4ed9a292e92ba9569b
Author: Jan Kratochvil <jan.kratochvil at redhat.com>
Date: Wed Dec 21 19:07:49 2011 +0100
[python] Fix crash when pretty printer fails (Phil Muldoon, BZ 712715).
gdb-pretty-printer-crash.patch | 203 ++++++++++++++++++++++++++++++++++++++++
gdb.spec | 9 ++-
2 files changed, 211 insertions(+), 1 deletions(-)
---
diff --git a/gdb-pretty-printer-crash.patch b/gdb-pretty-printer-crash.patch
new file mode 100644
index 0000000..f61b23c
--- /dev/null
+++ b/gdb-pretty-printer-crash.patch
@@ -0,0 +1,203 @@
+[patch][python] Fix sigsegv when a printer fails to return a value and string_print is set.
+http://sourceware.org/ml/gdb-patches/2011-07/msg00719.html
+http://sourceware.org/ml/gdb-cvs/2011-07/msg00234.html
+
+### src/gdb/ChangeLog 2011/07/27 19:31:30 1.13236
+### src/gdb/ChangeLog 2011/07/28 10:36:37 1.13237
+## -1,3 +1,8 @@
++2011-07-28 Phil Muldoon <pmuldoon at redhat.com>
++
++ * varobj.c (value_get_print_value): Move hint check later into the
++ function. Comment function. Free thevalue before reusing it.
++
+ 2011-07-27 Jan Kratochvil <jan.kratochvil at redhat.com>
+ Pedro Alves <pedro at codesourcery.com>
+
+--- src/gdb/varobj.c 2011/07/18 09:21:43 1.180
++++ src/gdb/varobj.c 2011/07/28 10:36:40 1.181
+@@ -2610,25 +2610,21 @@
+
+ if (PyObject_HasAttr (value_formatter, gdbpy_to_string_cst))
+ {
+- char *hint;
+ struct value *replacement;
+ PyObject *output = NULL;
+
+- hint = gdbpy_get_display_hint (value_formatter);
+- if (hint)
+- {
+- if (!strcmp (hint, "string"))
+- string_print = 1;
+- xfree (hint);
+- }
+-
+ output = apply_varobj_pretty_printer (value_formatter,
+ &replacement,
+ stb);
++
++ /* If we have string like output ... */
+ if (output)
+ {
+ make_cleanup_py_decref (output);
+
++ /* If this is a lazy string, extract it. For lazy
++ strings we always print as a string, so set
++ string_print. */
+ if (gdbpy_is_lazy_string (output))
+ {
+ gdbpy_extract_lazy_string (output, &str_addr, &type,
+@@ -2638,12 +2634,27 @@
+ }
+ else
+ {
++ /* If it is a regular (non-lazy) string, extract
++ it and copy the contents into THEVALUE. If the
++ hint says to print it as a string, set
++ string_print. Otherwise just return the extracted
++ string as a value. */
++
+ PyObject *py_str
+ = python_string_to_target_python_string (output);
+
+ if (py_str)
+ {
+ char *s = PyString_AsString (py_str);
++ char *hint;
++
++ hint = gdbpy_get_display_hint (value_formatter);
++ if (hint)
++ {
++ if (!strcmp (hint, "string"))
++ string_print = 1;
++ xfree (hint);
++ }
+
+ len = PyString_Size (py_str);
+ thevalue = xmemdup (s, len + 1, len + 1);
+@@ -2662,6 +2673,9 @@
+ gdbpy_print_stack ();
+ }
+ }
++ /* If the printer returned a replacement value, set VALUE
++ to REPLACEMENT. If there is not a replacement value,
++ just use the value passed to this function. */
+ if (replacement)
+ value = replacement;
+ }
+@@ -2672,12 +2686,18 @@
+ get_formatted_print_options (&opts, format_code[(int) format]);
+ opts.deref_ref = 0;
+ opts.raw = 1;
++
++ /* If the THEVALUE has contents, it is a regular string. */
+ if (thevalue)
+ LA_PRINT_STRING (stb, type, thevalue, len, encoding, 0, &opts);
+ else if (string_print)
++ /* Otherwise, if string_print is set, and it is not a regular
++ string, it is a lazy string. */
+ val_print_string (type, encoding, str_addr, len, stb, &opts);
+ else
++ /* All other cases. */
+ common_val_print (value, stb, 0, &opts, current_language);
++
+ thevalue = ui_file_xstrdup (stb, NULL);
+
+ do_cleanups (old_chain);
+### src/gdb/testsuite/ChangeLog 2011/07/27 21:18:39 1.2816
+### src/gdb/testsuite/ChangeLog 2011/07/28 10:36:40 1.2817
+## -1,3 +1,10 @@
++2011-07-28 Phil Muldoon <pmuldoon at redhat.com>
++
++ * gdb.python/py-mi.exp: Test printers returning string hint, and
++ also not returning a value.
++ * gdb.python/py-prettyprint.c: Add testcase for above.
++ * gdb.python/py-prettyprint.py: Add test printer for above.
++
+ 2011-07-27 Jan Kratochvil <jan.kratochvil at redhat.com>
+
+ * gdb.dwarf2/dw2-simple-locdesc.S: Change DWARF version to 3.
+--- src/gdb/testsuite/gdb.python/py-mi.exp 2011/07/26 18:38:55 1.13
++++ src/gdb/testsuite/gdb.python/py-mi.exp 2011/07/28 10:36:40 1.14
+@@ -284,6 +284,13 @@ mi_list_varobj_children nstype2 {
+ { {nstype2.<error at 0>} {<error at 0>} 6 {char \[6\]} }
+ } "list children after setting exception flag"
+
++mi_create_varobj me me \
++ "create me varobj"
++
++mi_gdb_test "-var-evaluate-expression me" \
++ "\\^done,value=\"<error reading variable: Cannot access memory.>.*\"" \
++ "evaluate me varobj"
++
+ # C++ MI tests
+ gdb_exit
+ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
+--- src/gdb/testsuite/gdb.python/py-prettyprint.c 2011/04/29 12:45:46 1.12
++++ src/gdb/testsuite/gdb.python/py-prettyprint.c 2011/07/28 10:36:40 1.13
+@@ -149,6 +149,11 @@
+
+ typedef struct justchildren nostring_type;
+
++struct memory_error
++{
++ const char *s;
++};
++
+ struct container
+ {
+ string name;
+@@ -227,6 +232,7 @@
+ /* Clearing by being `static' could invoke an other GDB C++ bug. */
+ struct nullstr nullstr;
+ nostring_type nstype, nstype2;
++ struct memory_error me;
+ struct ns ns, ns2;
+ struct lazystring estring, estring2;
+ struct hint_error hint_error;
+@@ -234,6 +240,8 @@
+ nstype.elements = narray;
+ nstype.len = 0;
+
++ me.s = "blah";
++
+ init_ss(&ss, 1, 2);
+ init_ss(ssa+0, 3, 4);
+ init_ss(ssa+1, 5, 6);
+--- src/gdb/testsuite/gdb.python/py-prettyprint.py 2011/04/11 17:40:41 1.11
++++ src/gdb/testsuite/gdb.python/py-prettyprint.py 2011/07/28 10:36:40 1.12
+@@ -17,6 +17,7 @@
+ # printers.
+
+ import re
++import gdb
+
+ # Test returning a Value from a printer.
+ class string_print:
+@@ -186,6 +187,18 @@
+ yield 's', self.val['s']
+ yield 'x', self.val['x']
+
++class MemoryErrorString:
++ "Raise an error"
++
++ def __init__(self, val):
++ self.val = val
++
++ def to_string(self):
++ raise gdb.MemoryError ("Cannot access memory.");
++
++ def display_hint (self):
++ return 'string'
++
+ def lookup_function (val):
+ "Look-up and return a pretty-printer that can print val."
+
+@@ -261,6 +274,8 @@
+ pretty_printers_dict[re.compile ('^struct hint_error$')] = pp_hint_error
+ pretty_printers_dict[re.compile ('^hint_error$')] = pp_hint_error
+
++ pretty_printers_dict[re.compile ('^memory_error$')] = MemoryErrorString
++
+ pretty_printers_dict = {}
+
+ register_pretty_printers ()
diff --git a/gdb.spec b/gdb.spec
index 68da2a3..4071eb6 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -27,7 +27,7 @@ Version: 7.3.1
# 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: 46%{?_with_upstream:.upstream}%{?dist}
+Release: 47%{?_with_upstream:.upstream}%{?dist}
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain
Group: Development/Debuggers
@@ -580,6 +580,9 @@ Patch635: gdb-python-load-commands.patch
# (Aleksandar Ristovski, BZ 750341).
Patch636: gdb-anon-namespace-crash.patch
+# [python] Fix crash when pretty printer fails (Phil Muldoon, BZ 712715).
+Patch637: gdb-pretty-printer-crash.patch
+
BuildRequires: ncurses-devel%{?_isa} texinfo gettext flex bison expat-devel%{?_isa}
# --without-system-readline
# Requires: readline%{?_isa}
@@ -862,6 +865,7 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
%patch631 -p1
%patch635 -p1
%patch636 -p1
+%patch637 -p1
%patch393 -p1
%patch335 -p1
@@ -1284,6 +1288,9 @@ fi
%{_infodir}/gdb.info*
%changelog
+* Wed Dec 21 2011 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.3.1-47.fc15
+- [python] Fix crash when pretty printer fails (Phil Muldoon, BZ 712715).
+
* Thu Nov 10 2011 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.3.1-46.fc15
- Register all available PythonGDB commands (BZ 752095).
- Backport fix for crash in cp_scan_for_anonymous_namespace
More information about the scm-commits
mailing list