From 692f6733122b2bf053299f8a0cdbcab3d5bfbfb5 Mon Sep 17 00:00:00 2001 From: Aleksandr Mezin Date: Sat, 6 Mar 2021 12:03:42 +0600 Subject: scripts/meson_exe: fix stdout and stderr decoding 1. use `locale.getpreferredencoding()` to get encoding name. `bytes.decode()` assumes `encoding='utf-8'` by default. It is incorrect on my Windows setup, and causes `UnicodeDecodeError`. 2. use `errors='replace'`. `bytes.decode()` assumes `errors='strict'` by default. Meson shouldn't crash if subprocess outputs some garbage that can't be decoded. `surrogateescape` doesn't work as expected on Windows. On Linux, default `errors` for `sys.stdout` is `strict`, so `surrogateescape` can't be used there too (at least until `sys.stdout` is reconfigured). Fixes https://github.com/mesonbuild/meson/issues/8480 --- mesonbuild/scripts/meson_exe.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'mesonbuild/scripts') diff --git a/mesonbuild/scripts/meson_exe.py b/mesonbuild/scripts/meson_exe.py index ceb9e4385..ea0fef6d2 100644 --- a/mesonbuild/scripts/meson_exe.py +++ b/mesonbuild/scripts/meson_exe.py @@ -18,6 +18,7 @@ import argparse import pickle import subprocess import typing as T +import locale from .. import mesonlib from ..backend.backends import ExecutableSerialisation @@ -70,11 +71,12 @@ def run_exe(exe: ExecutableSerialisation, extra_env: T.Optional[dict] = None) -> print(f'while executing {cmd_args!r}') if exe.verbose: return p.returncode + encoding = locale.getpreferredencoding() if not exe.capture: print('--- stdout ---') - print(stdout.decode()) + print(stdout.decode(encoding=encoding, errors='replace')) print('--- stderr ---') - print(stderr.decode()) + print(stderr.decode(encoding=encoding, errors='replace')) return p.returncode if exe.capture: -- cgit v1.2.3