From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Sun, 25 Jan 2026 17:11:45 +0000 (+0100) Subject: [3.14] gh-143237: Fix support of named pipes in the rotating logging handlers (GH... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c9548f3dfc3c56bff355caf1416326c0da2f67f5;p=thirdparty%2FPython%2Fcpython.git [3.14] gh-143237: Fix support of named pipes in the rotating logging handlers (GH-143259) (#143297) Co-authored-by: Serhiy Storchaka --- diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index 2748b5941ead..4a07258f8d6d 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -196,7 +196,11 @@ class RotatingFileHandler(BaseRotatingHandler): if self.stream is None: # delay was set... self.stream = self._open() if self.maxBytes > 0: # are we rolling over? - pos = self.stream.tell() + try: + pos = self.stream.tell() + except io.UnsupportedOperation: + # gh-143237: Never rollover a named pipe. + return False if not pos: # gh-116263: Never rollover an empty file return False diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 99869fdd9e70..c1dc06e02d96 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -25,6 +25,7 @@ import logging.config import codecs import configparser +import contextlib import copy import datetime import pathlib @@ -6343,6 +6344,32 @@ class RotatingFileHandlerTest(BaseFileTest): self.assertFalse(rh.shouldRollover(self.next_rec())) rh.close() + @unittest.skipUnless(hasattr(os, "mkfifo"), 'requires os.mkfifo()') + def test_should_not_rollover_named_pipe(self): + # gh-143237 - test with non-seekable special file (named pipe) + filename = os_helper.TESTFN + self.addCleanup(os_helper.unlink, filename) + try: + os.mkfifo(filename) + except PermissionError as e: + self.skipTest('os.mkfifo(): %s' % e) + + data = 'not read' + def other_side(): + nonlocal data + with open(filename, 'rb') as f: + data = f.read() + + thread = threading.Thread(target=other_side) + with threading_helper.start_threads([thread]): + rh = logging.handlers.RotatingFileHandler( + filename, encoding="utf-8", maxBytes=1) + with contextlib.closing(rh): + m = self.next_rec() + self.assertFalse(rh.shouldRollover(m)) + rh.emit(m) + self.assertEqual(data.decode(), m.msg + os.linesep) + def test_should_rollover(self): with open(self.fn, 'wb') as f: f.write(b'\n') diff --git a/Misc/NEWS.d/next/Library/2025-12-28-20-28-05.gh-issue-143237.q1ymuA.rst b/Misc/NEWS.d/next/Library/2025-12-28-20-28-05.gh-issue-143237.q1ymuA.rst new file mode 100644 index 000000000000..131bebcd984a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-28-20-28-05.gh-issue-143237.q1ymuA.rst @@ -0,0 +1 @@ +Fix support of named pipes in the rotating :mod:`logging` handlers.