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)
This commit is contained in:
Kovid Goyal 2023-10-16 14:01:21 +05:30
parent 347b911b8d
commit 77f303179c
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 5 additions and 1 deletions

View File

@ -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))

View File

@ -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())