diff mbox series

[v2] pm-graph v5.10 regression fix

Message ID 20230313222652.402272-1-todd.e.brandt@linux.intel.com (mailing list archive)
State Mainlined, archived
Headers show
Series [v2] pm-graph v5.10 regression fix | expand

Commit Message

Todd Brandt March 13, 2023, 10:26 p.m. UTC
A regression has occurred in the hid-sensor code where a device
name string has not been initialized to 0, and ends up without
a NULL char and its printed with %s. This includes random binary
data in the device name, which makes its way into the ftrace output
and ends up crashing sleepgraph because it expects the ftrace output
to be ASCII only.

For example: "HID-SENSOR-INT-020b?.39.auto" ends up in ftrace instead
of "HID-SENSOR-INT-020b.39.auto". It causes this crash in sleepgraph:

  File "/usr/bin/sleepgraph", line 5579, in executeSuspend
    for line in fp:
  File "/usr/lib/python3.10/codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position
1568: invalid start byte

The issue is in 6.3-rc1 and is decribed in full here:
https://bugzilla.kernel.org/show_bug.cgi?id=217169

I've submitted a separate fix to have this issue repaired, but
it has also exposed a larger bug in sleepgraph, since nothing should make
sleepgraph crash. Sleepgraph needs to be able to handle biary
data showing up in ftrace gracefully.

I've changed the ftrace processing code to treat it as potentially
binary and to filter out binary data and leave just the ASCII.

Signed-off-by: Todd Brandt <todd.e.brandt@linux.intel.com>
---
 tools/power/pm-graph/sleepgraph.py | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

Comments

Rafael J. Wysocki March 14, 2023, 5:53 p.m. UTC | #1
On Mon, Mar 13, 2023 at 11:26 PM Todd Brandt
<todd.e.brandt@linux.intel.com> wrote:
>
> A regression has occurred in the hid-sensor code where a device
> name string has not been initialized to 0, and ends up without
> a NULL char and its printed with %s. This includes random binary
> data in the device name, which makes its way into the ftrace output
> and ends up crashing sleepgraph because it expects the ftrace output
> to be ASCII only.
>
> For example: "HID-SENSOR-INT-020b?.39.auto" ends up in ftrace instead
> of "HID-SENSOR-INT-020b.39.auto". It causes this crash in sleepgraph:
>
>   File "/usr/bin/sleepgraph", line 5579, in executeSuspend
>     for line in fp:
>   File "/usr/lib/python3.10/codecs.py", line 322, in decode
>     (result, consumed) = self._buffer_decode(data, self.errors, final)
> UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position
> 1568: invalid start byte
>
> The issue is in 6.3-rc1 and is decribed in full here:
> https://bugzilla.kernel.org/show_bug.cgi?id=217169
>
> I've submitted a separate fix to have this issue repaired, but
> it has also exposed a larger bug in sleepgraph, since nothing should make
> sleepgraph crash. Sleepgraph needs to be able to handle biary
> data showing up in ftrace gracefully.
>
> I've changed the ftrace processing code to treat it as potentially
> binary and to filter out binary data and leave just the ASCII.

Thanks a lot for the detailed description of the problem, it helps quite a bit.

I've modified the subject and changelog somewhat and applied this as
6.3-rc material, thanks!

> Signed-off-by: Todd Brandt <todd.e.brandt@linux.intel.com>
> ---
>  tools/power/pm-graph/sleepgraph.py | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/tools/power/pm-graph/sleepgraph.py b/tools/power/pm-graph/sleepgraph.py
> index 82c09cd25cc2..bf4ac24a1c7a 100755
> --- a/tools/power/pm-graph/sleepgraph.py
> +++ b/tools/power/pm-graph/sleepgraph.py
> @@ -5556,9 +5556,8 @@ def executeSuspend(quiet=False):
>                 if not quiet:
>                         pprint('CAPTURING TRACE')
>                 op = sv.writeDatafileHeader(sv.ftracefile, testdata)
> -               fp = open(tp+'trace', 'r')
> -               for line in fp:
> -                       op.write(line)
> +               fp = open(tp+'trace', 'rb')
> +               op.write(ascii(fp.read()))
>                 op.close()
>                 sv.fsetVal('', 'trace')
>                 sv.platforminfo(cmdafter)
> --
diff mbox series

Patch

diff --git a/tools/power/pm-graph/sleepgraph.py b/tools/power/pm-graph/sleepgraph.py
index 82c09cd25cc2..bf4ac24a1c7a 100755
--- a/tools/power/pm-graph/sleepgraph.py
+++ b/tools/power/pm-graph/sleepgraph.py
@@ -5556,9 +5556,8 @@  def executeSuspend(quiet=False):
 		if not quiet:
 			pprint('CAPTURING TRACE')
 		op = sv.writeDatafileHeader(sv.ftracefile, testdata)
-		fp = open(tp+'trace', 'r')
-		for line in fp:
-			op.write(line)
+		fp = open(tp+'trace', 'rb')
+		op.write(ascii(fp.read()))
 		op.close()
 		sv.fsetVal('', 'trace')
 		sv.platforminfo(cmdafter)