From 16a99487590b6b19dc06569f18ffadc70c78dcf3 Mon Sep 17 00:00:00 2001 From: George Edward Bulmer Date: Tue, 12 Dec 2017 22:23:33 +0000 Subject: [PATCH 1/3] Replace malformed utf-8 characters in spawn output. Previously this simply crashed if there was ever malformed utf-8 in the stderr or stdout streams, perhaps as a result of an incorrectly spawned command. See e.g. #3222 --- qutebrowser/misc/guiprocess.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/qutebrowser/misc/guiprocess.py b/qutebrowser/misc/guiprocess.py index 4fb887de0..a0a8ad639 100644 --- a/qutebrowser/misc/guiprocess.py +++ b/qutebrowser/misc/guiprocess.py @@ -98,8 +98,10 @@ class GUIProcess(QObject): log.procs.debug("Process finished with code {}, status {}.".format( code, status)) - stderr = bytes(self._proc.readAllStandardError()).decode('utf-8') - stdout = bytes(self._proc.readAllStandardOutput()).decode('utf-8') + stderr = bytes(self._proc.readAllStandardError()).decode('utf-8', + 'replace') + stdout = bytes(self._proc.readAllStandardOutput()).decode('utf-8', + 'replace') qutescheme.spawn_output = self._spawn_format(code, status, stdout, stderr) From 28961ab177d9d70109b58f9dc741232328d089c3 Mon Sep 17 00:00:00 2001 From: George Edward Bulmer Date: Wed, 13 Dec 2017 12:46:46 +0000 Subject: [PATCH 2/3] Add a test with invalid unicode in spawned stdout. stderr features identical behaviour, so is currently untested. --- tests/unit/misc/test_guiprocess.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/unit/misc/test_guiprocess.py b/tests/unit/misc/test_guiprocess.py index 25e46476e..473016b52 100644 --- a/tests/unit/misc/test_guiprocess.py +++ b/tests/unit/misc/test_guiprocess.py @@ -63,6 +63,20 @@ def test_start(proc, qtbot, message_mock, py_proc): assert qutescheme.spawn_output == proc._spawn_format(stdout="test") +def test_stdout_malformed_utf8(proc, qtbot, message_mock, py_proc): + """Test simply starting a process.""" + with qtbot.waitSignals([proc.started, proc.finished], timeout=10000, + order='strict'): + argv = py_proc(r""" + import sys + sys.stdout.buffer.write(b"A\x80B") + sys.exit(0) + """) + proc.start(*argv) + assert not message_mock.messages + assert qutescheme.spawn_output == proc._spawn_format(stdout="A\ufffdB") + + def test_start_verbose(proc, qtbot, message_mock, py_proc): """Test starting a process verbosely.""" proc.verbose = True From 84e0ce757ad3c4460b7394f3a321ae1ebc0e660c Mon Sep 17 00:00:00 2001 From: George Edward Bulmer Date: Wed, 13 Dec 2017 14:50:25 +0000 Subject: [PATCH 3/3] Fix erroneous docstring in a recently added test. --- tests/unit/misc/test_guiprocess.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/misc/test_guiprocess.py b/tests/unit/misc/test_guiprocess.py index 473016b52..b74b0383a 100644 --- a/tests/unit/misc/test_guiprocess.py +++ b/tests/unit/misc/test_guiprocess.py @@ -64,7 +64,7 @@ def test_start(proc, qtbot, message_mock, py_proc): def test_stdout_malformed_utf8(proc, qtbot, message_mock, py_proc): - """Test simply starting a process.""" + """Test handling malformed utf-8 in stdout.""" with qtbot.waitSignals([proc.started, proc.finished], timeout=10000, order='strict'): argv = py_proc(r"""