diff options
author | Richard van der Hoff <1389908+richvdh@users.noreply.github.com> | 2020-09-07 16:54:30 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-07 16:54:30 +0100 |
commit | 77794ebc776564291c5c8135b33f76d3fd79f550 (patch) | |
tree | 1a51935eb3eb4f0242a88fbc64dc6983dd32ca8d | |
parent | Bump canonicaljson to version 1.4.0 (#8262) (diff) | |
download | synapse-77794ebc776564291c5c8135b33f76d3fd79f550.tar.xz |
Fix stack overflow when logging system encounters an error (#8268)
Diffstat (limited to '')
-rw-r--r-- | changelog.d/8268.bugfix | 1 | ||||
-rw-r--r-- | synapse/config/logger.py | 25 |
2 files changed, 24 insertions, 2 deletions
diff --git a/changelog.d/8268.bugfix b/changelog.d/8268.bugfix new file mode 100644 index 0000000000..4b15a60253 --- /dev/null +++ b/changelog.d/8268.bugfix @@ -0,0 +1 @@ +Fix stack overflow when stderr is redirected to the logging system, and the logging system encounters an error. diff --git a/synapse/config/logger.py b/synapse/config/logger.py index c96e6ef62a..13d6f6a3ea 100644 --- a/synapse/config/logger.py +++ b/synapse/config/logger.py @@ -17,6 +17,7 @@ import logging import logging.config import os import sys +import threading from string import Template import yaml @@ -25,6 +26,7 @@ from twisted.logger import ( ILogObserver, LogBeginner, STDLibLogObserver, + eventAsText, globalLogBeginner, ) @@ -216,8 +218,9 @@ def _setup_stdlib_logging(config, log_config, logBeginner: LogBeginner): # system. observer = STDLibLogObserver() - def _log(event): + threadlocal = threading.local() + def _log(event): if "log_text" in event: if event["log_text"].startswith("DNSDatagramProtocol starting on "): return @@ -228,7 +231,25 @@ def _setup_stdlib_logging(config, log_config, logBeginner: LogBeginner): if event["log_text"].startswith("Timing out client"): return - return observer(event) + # this is a workaround to make sure we don't get stack overflows when the + # logging system raises an error which is written to stderr which is redirected + # to the logging system, etc. + if getattr(threadlocal, "active", False): + # write the text of the event, if any, to the *real* stderr (which may + # be redirected to /dev/null, but there's not much we can do) + try: + event_text = eventAsText(event) + print("logging during logging: %s" % event_text, file=sys.__stderr__) + except Exception: + # gah. + pass + return + + try: + threadlocal.active = True + return observer(event) + finally: + threadlocal.active = False logBeginner.beginLoggingTo([_log], redirectStandardIO=not config.no_redirect_stdio) if not config.no_redirect_stdio: |