diff --git a/system/logmessaged.py b/system/logmessaged.py index c095c261..05425c12 100755 --- a/system/logmessaged.py +++ b/system/logmessaged.py @@ -25,7 +25,7 @@ def main() -> NoReturn: while True: dat = b''.join(sock.recv_multipart()) level = dat[0] - record = dat[1:].decode("utf-8") + record = dat[1:].decode("utf-8", errors="backslashreplace") if level >= log_level: log_handler.emit(record) diff --git a/system/tests/test_logmessaged.py b/system/tests/test_logmessaged.py index 9ccc8ef5..8e463af7 100644 --- a/system/tests/test_logmessaged.py +++ b/system/tests/test_logmessaged.py @@ -3,6 +3,7 @@ import os import time import cereal.messaging as messaging +import zmq from openpilot.system.manager.process_config import managed_processes from openpilot.system.hardware.hw import Paths from openpilot.common.swaglog import cloudlog, ipchandler @@ -53,3 +54,19 @@ class TestLogmessaged: logsize = sum([os.path.getsize(f) for f in self._get_log_files()]) assert (n*len(msg)) < logsize < (n*(len(msg)+1024)) + def test_invalid_utf8_log(self): + ctx = zmq.Context() + sock = ctx.socket(zmq.PUSH) + sock.connect(Paths.swaglog_ipc()) + + try: + sock.send(b"\n" + b'{"msg":"\xff"}') + cloudlog.error("after invalid utf8 log") + time.sleep(0.5) + + msgs = [m.logMessage for m in messaging.drain_sock(self.sock)] + assert any('"\\xff"' in m for m in msgs) + assert any("after invalid utf8 log" in m for m in msgs) + finally: + sock.close() + ctx.term()