commit 28312c70fcba81ef50a93ff52dde47230efc35cb Author: Matthew Malcomson Date: Sun Feb 26 13:10:09 2017 +0000 convert_value_from_python include terminating NULL When converting python strings to internal gdb Value strings, the NULL byte was initially left out, this can result in extra data from the inferior being printed when the resulting value is used with printf "%s\n", value diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 962325be3a..486b7899fb 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -13645,8 +13645,8 @@ The source file for the current trace snapshot. The name of the function containing @code{$tracepoint}. @end table -Note: @code{$trace_file} is not suitable for use in @code{printf}, -use @code{output} instead. +Note: @code{$trace_file} and @code{$trace_file} are not suitable for use in +@code{printf}, use @code{output} instead. Here's a simple example of using these convenience variables for stepping through all the trace snapshots and printing some of their diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index eb3d307b19..c786f68865 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -1615,7 +1615,7 @@ convert_value_from_python (PyObject *obj) gdb::unique_xmalloc_ptr s = python_string_to_target_string (obj); if (s != NULL) - value = value_cstring (s.get (), strlen (s.get ()), + value = value_cstring (s.get (), strlen (s.get ()) + 1, builtin_type_pychar); } else if (PyObject_TypeCheck (obj, &value_object_type)) diff --git a/gdb/testsuite/gdb.python/py-as-string.c b/gdb/testsuite/gdb.python/py-as-string.c index de2e8a1951..e53f3a9b64 100644 --- a/gdb/testsuite/gdb.python/py-as-string.c +++ b/gdb/testsuite/gdb.python/py-as-string.c @@ -15,6 +15,8 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ +#include + enum EnumType { ENUM_VALUE_A, ENUM_VALUE_B, @@ -22,6 +24,20 @@ enum EnumType { ENUM_VALUE_D, }; +static char arena[51] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; + +/* Override malloc() so value_coerce_to_target() gets a known pointer, and we + know we'll see an error if $_as_string() returns a string that isn't NULL + terminated. */ +void +*malloc (size_t size) +{ + if (size > sizeof (arena)) + return NULL; + + return arena; +} + static enum EnumType enum_valid = ENUM_VALUE_B; static enum EnumType enum_invalid = 20; diff --git a/gdb/testsuite/gdb.python/py-as-string.exp b/gdb/testsuite/gdb.python/py-as-string.exp index 0c44d5f174..e4625631c2 100644 --- a/gdb/testsuite/gdb.python/py-as-string.exp +++ b/gdb/testsuite/gdb.python/py-as-string.exp @@ -35,6 +35,13 @@ proc test_as_string { } { gdb_test "p \$_as_string(2)" "\"2\"" gdb_test "p \$_as_string(enum_valid)" "\"ENUM_VALUE_B\"" gdb_test "p \$_as_string(enum_invalid)" "\"20\"" + + # Test that the NULL character is included in the returned value. + gdb_test "printf \"%s\\n\", \$_as_string(\"hi\")" "\"hi\"" + # Quote once to define the string, and once for the regexp. + gdb_test "interpreter-exec mi '-var-create test * \$_as_string(\"Hello\")'" \ + "\\^done,name=\"test\",numchild=\"8\",value=\"\\\[8]\",type=\"char \\\[8]\",has_more=\"0\"" + gdb_test "interpreter-exec mi '-var-delete test'" "\\^done,ndeleted=\"1\"" } test_as_string diff --git a/gdb/testsuite/gdb.python/py-mi.exp b/gdb/testsuite/gdb.python/py-mi.exp index 736dc7a0d6..a5ad3f0f44 100644 --- a/gdb/testsuite/gdb.python/py-mi.exp +++ b/gdb/testsuite/gdb.python/py-mi.exp @@ -281,7 +281,7 @@ mi_create_dynamic_varobj nstype2 nstype2 1 \ "create nstype2 varobj" mi_list_varobj_children nstype2 { - { {nstype2.} {} 6 {char \[6\]} } + { {nstype2.} {} 7 {char \[7\]} } } "list children after setting exception flag" mi_create_varobj me me \