From b9c6d3ae09b51faf4ab437282cbf9a4911c3fb2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Colomb?= Date: Mon, 9 Dec 2024 08:24:42 +0100 Subject: [PATCH] fix(config): skip GUI port probing for UNIX sockets (fixes #9855) (#9858) When creating an initial default config, we usually probe for a free TCP port. But when a UNIX socket is specified via the `STGUIADDRESS=` override or the `--gui-address=unix:///...` command line syntax, parsing that option will fail during port probing. The solution is to just skip the port probing when the address is determined to specify something other than a TCP socket. ### Testing Start with a fresh home directory each time. 1. Specify a UNIX socket for the GUI (works with this PR): TMPHOME=$(mktemp -d); ./syncthing --home=$TMPHOME --gui-address=unix://$TMPHOME/socket 2. Specify no GUI address (probes for a free port if default is taken, as before): TMPHOME=$(mktemp -d); ./syncthing --home=$TMPHOME 3. Specify a TCP GUI address (probes whether the given port is taken, as before): TMPHOME=$(mktemp -d); ./syncthing --home=$TMPHOME --gui-address=127.0.0.1:8385 --- lib/config/config.go | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/lib/config/config.go b/lib/config/config.go index a16c8923d..772694859 100644 --- a/lib/config/config.go +++ b/lib/config/config.go @@ -139,21 +139,23 @@ func New(myID protocol.DeviceID) Configuration { } func (cfg *Configuration) ProbeFreePorts() error { - guiHost, guiPort, err := net.SplitHostPort(cfg.GUI.Address()) - if err != nil { - return fmt.Errorf("get default port (GUI): %w", err) + if cfg.GUI.Network() == "tcp" { + guiHost, guiPort, err := net.SplitHostPort(cfg.GUI.Address()) + if err != nil { + return fmt.Errorf("get default port (GUI): %w", err) + } + port, err := strconv.Atoi(guiPort) + if err != nil { + return fmt.Errorf("convert default port (GUI): %w", err) + } + port, err = getFreePort(guiHost, port) + if err != nil { + return fmt.Errorf("get free port (GUI): %w", err) + } + cfg.GUI.RawAddress = net.JoinHostPort(guiHost, strconv.Itoa(port)) } - port, err := strconv.Atoi(guiPort) - if err != nil { - return fmt.Errorf("convert default port (GUI): %w", err) - } - port, err = getFreePort(guiHost, port) - if err != nil { - return fmt.Errorf("get free port (GUI): %w", err) - } - cfg.GUI.RawAddress = net.JoinHostPort(guiHost, strconv.Itoa(port)) - port, err = getFreePort("0.0.0.0", DefaultTCPPort) + port, err := getFreePort("0.0.0.0", DefaultTCPPort) if err != nil { return fmt.Errorf("get free port (BEP): %w", err) }