# HG changeset patch # User RhodeCode Admin # Date 2023-01-21 20:30:32 # Node ID d80ce1a5207b23f36edc9ce8a6a3e2895fe4a781 # Parent 169b0860722d993d28304c3d2c8bab8cd0abe3bd hooks: reserver only high-ports to limit possibility of hitting port from rhodecode stack diff --git a/rhodecode/lib/hooks_daemon.py b/rhodecode/lib/hooks_daemon.py --- a/rhodecode/lib/hooks_daemon.py +++ b/rhodecode/lib/hooks_daemon.py @@ -25,6 +25,7 @@ import tempfile import traceback import threading import socket +import random from BaseHTTPServer import BaseHTTPRequestHandler from SocketServer import TCPServer @@ -156,13 +157,19 @@ class HttpHooksCallbackDaemon(ThreadedHo def get_hostname(self): return socket.gethostname() or '127.0.0.1' - def get_available_port(self): - mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - mysocket.bind((self.get_hostname(), 0)) - port = mysocket.getsockname()[1] - mysocket.close() - del mysocket - return port + def get_available_port(self, min_port=20000, max_port=65535): + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + hostname = self.get_hostname() + + for _ in range(min_port, max_port): + pick_port = random.randint(min_port, max_port) + try: + sock.bind((hostname, pick_port)) + sock.close() + del sock + return pick_port + except OSError: + pass def _prepare(self, txn_id=None, host=None, port=None): if not host or host == "*":