From 77f303179c416042a9b74c323c88f4a876ac3925 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 16 Oct 2023 14:01:21 +0530 Subject: [PATCH] Linux: Content server: Do not call listen on pre-activated sockets Fixes #2039395 [Don't call listen() for systemd-allocated sockets](https://bugs.launchpad.net/calibre/+bug/2039395) Fixes #2069 (calibre-server: don't call listen() on pre-allocated sockets) --- src/calibre/srv/loop.py | 5 ++++- src/calibre/srv/tests/loop.py | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/calibre/srv/loop.py b/src/calibre/srv/loop.py index c284b8b7a4..dd17b90279 100644 --- a/src/calibre/srv/loop.py +++ b/src/calibre/srv/loop.py @@ -411,6 +411,7 @@ class ServerLoop: self.ssl_context.set_servername_callback(self.on_ssl_servername) self.pre_activated_socket = None + self.socket_was_preactivated = False if self.opts.allow_socket_preallocation: from calibre.srv.pre_activated import pre_activated_socket self.pre_activated_socket = pre_activated_socket() @@ -501,12 +502,14 @@ class ServerLoop: self.do_bind() else: self.socket = self.pre_activated_socket + self.socket_was_preactivated = True self.pre_activated_socket = None self.setup_socket() def serve(self): self.connection_map = {} - self.socket.listen(min(socket.SOMAXCONN, 128)) + if not self.socket_was_preactivated: + self.socket.listen(min(socket.SOMAXCONN, 128)) self.bound_address = ba = self.socket.getsockname() if isinstance(ba, tuple): ba = ':'.join(map(str, ba)) diff --git a/src/calibre/srv/tests/loop.py b/src/calibre/srv/tests/loop.py index 13870cee1a..a5f3bccc01 100644 --- a/src/calibre/srv/tests/loop.py +++ b/src/calibre/srv/tests/loop.py @@ -214,6 +214,7 @@ class LoopTest(BaseTest): os.closerange(3, 4) # Ensure the socket gets fileno == 3 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) s.bind(('localhost', 0)) + s.listen() # pre-activated sockets are already listening port = s.getsockname()[1] self.ae(s.fileno(), 3) os.environ['LISTEN_PID'] = str(os.getpid())