| From 9799aa449f68c9280c1cb799db92445906badaae Mon Sep 17 00:00:00 2001 |
| From: Tony Jones <tonyj@suse.de> |
| Date: Wed, 23 Jan 2019 16:52:25 -0800 |
| Subject: perf script python: Use PyBytes for attr in trace-event-python |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| [ Upstream commit 72e0b15cb24a497d7d0d4707cf51ff40c185ae8c ] |
| |
| With Python3. PyUnicode_FromStringAndSize is unsafe to call on attr and will |
| return NULL. Use _PyBytes_FromStringAndSize (as with raw_buf). |
| |
| Below is the observed behavior without the fix. Note it is first necessary |
| to apply the prior fix (Add trace_context extension module to sys,modules): |
| |
| # ldd /usr/bin/perf | grep -i python |
| libpython3.6m.so.1.0 => /usr/lib64/libpython3.6m.so.1.0 (0x00007f8e1dfb2000) |
| |
| # perf record -e raw_syscalls:sys_enter /bin/false |
| [ perf record: Woken up 1 times to write data ] |
| [ perf record: Captured and wrote 0.018 MB perf.data (21 samples) ] |
| |
| # perf script -g python | cat |
| generated Python script: perf-script.py |
| |
| # perf script -s ./perf-script.py |
| in trace_begin |
| Segmentation fault (core dumped) |
| |
| Signed-off-by: Tony Jones <tonyj@suse.de> |
| Acked-by: Jiri Olsa <jolsa@kernel.org> |
| Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Cc: Jaroslav Škarvada <jskarvad@redhat.com> |
| Cc: Jonathan Corbet <corbet@lwn.net> |
| Cc: Ravi Bangoria <ravi.bangoria@linux.ibm.com> |
| Cc: Seeteena Thoufeek <s1seetee@linux.vnet.ibm.com> |
| Fixes: 66dfdff03d19 ("perf tools: Add Python 3 support") |
| Link: http://lkml.kernel.org/r/20190124005229.16146-3-tonyj@suse.de |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/perf/util/scripting-engines/trace-event-python.c | 3 +-- |
| 1 file changed, 1 insertion(+), 2 deletions(-) |
| |
| diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c |
| index 87ef16a1b17e..2fe3cc43526f 100644 |
| --- a/tools/perf/util/scripting-engines/trace-event-python.c |
| +++ b/tools/perf/util/scripting-engines/trace-event-python.c |
| @@ -733,8 +733,7 @@ static PyObject *get_perf_sample_dict(struct perf_sample *sample, |
| Py_FatalError("couldn't create Python dictionary"); |
| |
| pydict_set_item_string_decref(dict, "ev_name", _PyUnicode_FromString(perf_evsel__name(evsel))); |
| - pydict_set_item_string_decref(dict, "attr", _PyUnicode_FromStringAndSize( |
| - (const char *)&evsel->attr, sizeof(evsel->attr))); |
| + pydict_set_item_string_decref(dict, "attr", _PyBytes_FromStringAndSize((const char *)&evsel->attr, sizeof(evsel->attr))); |
| |
| pydict_set_item_string_decref(dict_sample, "pid", |
| _PyLong_FromLong(sample->pid)); |
| -- |
| 2.19.1 |
| |