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.ssl_context.set_servername_callback(self.on_ssl_servername)
self.pre_activated_socket = None self.pre_activated_socket = None
self.socket_was_preactivated = False
if self.opts.allow_socket_preallocation: if self.opts.allow_socket_preallocation:
from calibre.srv.pre_activated import pre_activated_socket from calibre.srv.pre_activated import pre_activated_socket
self.pre_activated_socket = pre_activated_socket() self.pre_activated_socket = pre_activated_socket()
@ -501,11 +502,13 @@ class ServerLoop:
self.do_bind() self.do_bind()
else: else:
self.socket = self.pre_activated_socket self.socket = self.pre_activated_socket
self.socket_was_preactivated = True
self.pre_activated_socket = None self.pre_activated_socket = None
self.setup_socket() self.setup_socket()
def serve(self): def serve(self):
self.connection_map = {} self.connection_map = {}
if not self.socket_was_preactivated:
self.socket.listen(min(socket.SOMAXCONN, 128)) self.socket.listen(min(socket.SOMAXCONN, 128))
self.bound_address = ba = self.socket.getsockname() self.bound_address = ba = self.socket.getsockname()
if isinstance(ba, tuple): if isinstance(ba, tuple):

View File

@ -214,6 +214,7 @@ class LoopTest(BaseTest):
os.closerange(3, 4) # Ensure the socket gets fileno == 3 os.closerange(3, 4) # Ensure the socket gets fileno == 3
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
s.bind(('localhost', 0)) s.bind(('localhost', 0))
s.listen() # pre-activated sockets are already listening
port = s.getsockname()[1] port = s.getsockname()[1]
self.ae(s.fileno(), 3) self.ae(s.fileno(), 3)
os.environ['LISTEN_PID'] = str(os.getpid()) os.environ['LISTEN_PID'] = str(os.getpid())