From: Matthew Malcomson <hardenedapple@gmail.com>
To: Simon Marchi <simon.marchi@polymtl.ca>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH] fix bug with command `printf "%s\n", $_as_string($pc)`
Date: Sat, 25 Feb 2017 11:45:00 -0000 [thread overview]
Message-ID: <1cbe8b68-b592-825a-c662-56096ef0f795@gmail.com> (raw)
In-Reply-To: <1d49ea752aae175256c0278bf3a999bc@polymtl.ca>
On 20/02/17 18:19, Simon Marchi wrote:
> On 2017-02-19 12:32, Matthew Malcomson wrote:
>> 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<char> 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))
>
> This fix looks good to me.
>
> One test (py-mi.exp) needs to be updated though. You can run all the
> Python-related tests using:
>
> $ make check TESTS="gdb.python/*.exp"
>
> Normally, the Python tests all pass reliably, unlike some other parts
> of the testsuite.
>
> It might also be good to improve gdb.python/py-as-string.exp to
> include a test for this bug.
>
> Thanks,
>
> Simon
Thanks -- I had mistakenly ignored the py-mi.exp failure assuming it was
nothing to do with me (my apologies).
I've included the test fixes you suggested below.
------------------------------------------------
CHANGELOG:
2017-02-19 Matthew Malcomson <hardenedapple@gmail.com>
* python/py-value.c (convert_value_from_python): Include NULL
terminator in result.
testsuite/gdb.python/py-as-string.c,
testsuite/gdb.python/py-as-string.exp: Update tests
to account for NULL terminator from python string values.
doc/gdb.texinfo ($trace_func): Mention this value can't be used
with printf.
-------------------------------------------------
PATCH:
commit 44fd8bd7af5cf4c6b32846dd78ebfecb7b8d9fa5
Author: Matthew Malcomson <hardenedapple@gmail.com>
Date: Sun Feb 19 14:35: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 c465dc2f9f..5fb34853f1 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<char> 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..c35a692712 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
<http://www.gnu.org/licenses/>. */
+#include <stddef.h>
+
enum EnumType {
ENUM_VALUE_A,
ENUM_VALUE_B,
@@ -22,6 +24,19 @@ 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..819442834c 100644
--- a/gdb/testsuite/gdb.python/py-as-string.exp
+++ b/gdb/testsuite/gdb.python/py-as-string.exp
@@ -35,6 +35,12 @@ 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.<error at 0>} {<error at 0>} 6 {char \[6\]} }
+ { {nstype2.<error at 0>} {<error at 0>} 7 {char \[7\]} }
} "list children after setting exception flag"
mi_create_varobj me me \
next prev parent reply other threads:[~2017-02-25 11:45 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-19 17:32 Matthew Malcomson
2017-02-20 18:20 ` Simon Marchi
2017-02-25 11:45 ` Matthew Malcomson [this message]
2017-02-25 18:33 ` Simon Marchi
2017-02-25 19:11 ` Matthew Malcomson
2017-02-25 21:33 ` Simon Marchi
2017-02-26 13:20 ` Matthew Malcomson
2017-02-26 14:44 ` Simon Marchi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1cbe8b68-b592-825a-c662-56096ef0f795@gmail.com \
--to=hardenedapple@gmail.com \
--cc=gdb-patches@sourceware.org \
--cc=simon.marchi@polymtl.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox